我有一个剃刀视图,其中包含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; }
我的剃刀视图如下所示:
@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");}
}
单击“保存”按钮时,我最终会按照我的预期结束A控制器的保存(POST)操作方法:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Save(AViewModel viewModel)
{
return Ok();
}
但是,我注意到viewModel参数的所有属性都是空的。
这是否意味着我必须将ProductViewModel对象作为我的ViewModel传递给所有这5个表单的Save Action Method,其中只会填充范围中的ViewModel而其他所有内容都将为null?或者有更好的方法吗?
答案 0 :(得分:6)
我建议将每个表单设为局部视图,并仅传入父模型所需的子模型
@{await Html.RenderPartialAsync("AViewPartial", Model.AViewModel); }
然后您可以从
更改部分输入<input asp-for="AViewModel.Name" class="form-control"/>
到
<input asp-for="Name" class="form-control"/>
应该使模型绑定器正确绑定,以便将其传递给您的操作
答案 1 :(得分:2)
POST方法的参数必须为ProductViewModel
。
原因在于HTML中命名属性的方式:
<input asp-for="AViewModel.Name" class="form-control"/>
模型绑定器采用序列化形式,并且看到您正在为POST方法发送一个名为AViewModel.Name
的属性的值。当您的参数类型为AViewModel
时,它找不到任何内容,因为它正在查找名称为AViewModel
的参数类型的子属性,然后分配 对象的Name
属性为输入值。
如果您不想为每个POST方法ProductViewModel
创建参数,那么您有一个主要的替代方案:为您的五种不同表单创建部分视图,并从您的{传递单个属性{1}}作为局部视图的模型。然后,这会从ProductViewModel
属性中删除AViewModel
属性前缀。