null之所以建立模型,是因为您向表单提供输入的方式意味着模型联编程序无法区分元素。现在,此代码:
@foreach (var planVM in Model){ @Html.Partial("_partialView", planVM)}
没有为这些项目提供任何类型的索引。因此它将反复生成如下HTML输出:
<input type="hidden" name="yourmodelprefix.PlanID" /><input type="hidden" name="yourmodelprefix.CurrentPlan" /><input type="checkbox" name="yourmodelprefix.ShouldCompare" />
但是,由于要绑定到集合,因此需要使用索引来命名表单元素,例如:
<input type="hidden" name="yourmodelprefix[0].PlanID" /><input type="hidden" name="yourmodelprefix[0].CurrentPlan" /><input type="checkbox" name="yourmodelprefix[0].ShouldCompare" /><input type="hidden" name="yourmodelprefix[1].PlanID" /><input type="hidden" name="yourmodelprefix[1].CurrentPlan" /><input type="checkbox" name="yourmodelprefix[1].ShouldCompare" />
该索引使模型绑定器能够关联单独的数据,从而构建正确的模型。所以这是我建议您修复的方法。而不是使用局部视图来遍历您的集合,而是利用模板的功能。这是您需要遵循的步骤:
EditorTemplates
在视图的当前文件夹内创建一个文件夹(例如,如果视图为HomeIndex.cshtml
,则创建文件夹HomeEditorTemplates
)。- 在该目录中创建一个名称与您的模型匹配的强类型视图。在你的情况下
PlanCompareViewModel.cshtml
。
现在,您在部分视图中拥有的所有内容都希望进入该模板:
@model PlanCompareViewModel<div> @Html.HiddenFor(p => p.PlanID) @Html.HiddenFor(p => p.CurrentPlan) @Html.CheckBoxFor(p => p.ShouldCompare) <input type="submit" value="Compare"/></div>
最后,您的父视图简化为:
@model IEnumerable<PlanCompareViewModel>@using (Html.BeginForm("ComparePlans", "Plans", FormMethod.Post, new { id = "compareForm" })){<div> @Html.EditorForModel()</div>}
DisplayTemplates并且
EditorTemplates足够聪明,知道他们何时处理集合。这意味着它们将自动为表单元素生成正确的名称(包括索引),以便您可以对绑定到集合的模型进行正确建模。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)