使用单一视图模型在MVC Razor View上发布多个表单

Bla*_*ell 6 c# razor asp.net-core-mvc asp.net-core

我有一个剃刀视图,将包含5个表单.(A,B,C,D,E).这些表单中的每一个都有自己的ViewModel(AViewModel,BViewModel,CViewModel,DViewModel,EViewModel).

我创建了一个父ProductViewModel,该页面将用作唯一的ViewModel.在这个ViewModel中,将是页面上每个表单的所有其他ViewModel(如上所列).

以下是ProductViewModel的属性:

public AViewModel { get; set; }
public BViewModel { get; set; }
public CViewModel { get; set; }
public DViewModel { get; set; }
public EViewModel { get; set; }
Run Code Online (Sandbox Code Playgroud)

我的剃刀视图如下所示:

@model MVCApp.ViewModels.ProductViewModel

@{
    ViewData["Title"] = "Product Detail";
}

<h2>Product Detail</h2>

<form asp-controller="A" asp-action="Save" data-ajax="true" data-ajax-method="POST">
    <div class="form-horizontal">
        <h4>Form A</h4>
        <hr />
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="AViewModel.Name" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="AViewModel.Name" class="form-control"/>
                <span asp-validation-for="AViewModel.Name" class="text-danger" />
            </div>
        </div>
        <div class="form-group">
            <label asp-for="AViewModel.StartDate" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="AViewModel.StartDate" class="form-control"/>
                <span asp-validation-for="AViewModel.StartDate" class="text-danger" />
            </div>
        </div>
        <div class="form-group">
            <label asp-for="AViewModel.EndDate" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="AViewModel.EndDate" class="form-control"/>
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
</form>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
Run Code Online (Sandbox Code Playgroud)

单击"保存"按钮时,我最终进入A控制器的保存(POST)操作方法,就像我期望的那样:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Save(AViewModel viewModel)
    {
        return Ok();
    }
Run Code Online (Sandbox Code Playgroud)

但是,我注意到viewModel参数的所有属性都是空的.

这是否意味着我必须将ProductViewModel对象作为我的ViewModel传递给所有这5个表单的Save Action Method,其中只会填充范围中的ViewModel而其他所有内容都将为null?或者,还有更好的方法?

Joe*_*tte 6

我建议将每个表单作为局部视图,并仅传递父模型所需的子模型

 @{await Html.RenderPartialAsync("AViewPartial", Model.AViewModel); }
Run Code Online (Sandbox Code Playgroud)

然后您可以更改部分输入

<input asp-for="AViewModel.Name" class="form-control"/>
Run Code Online (Sandbox Code Playgroud)

<input asp-for="Name" class="form-control"/>
Run Code Online (Sandbox Code Playgroud)

这应该使模型绑定器正确绑定,以便它传递给你的动作