我有一个页面,其中呈现了 2 个或更多部分视图。每个视图都是可提交的表单。为视图提供的模型是从保存对象和对象列表的MyProject.Models.CompositeModel
提交的(这两个对象都 ADO.NET 模型,我们称它们为 Model_1 和 Model_2(。
呈现到分部视图的 2+ 模型具有具有相同名称的属性,并且输入也具有相同的名称(事实上model_2窗体可以有 n 次迭代,并且 2 个模型本身具有一些具有相同名称的属性(。
我将父视图呈现为:
@model MyProject.Models.CompositeModel
@{
ViewBag.Title = "Edit";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Edit</h2>
@Html.Partial("_Table1EditRowPartial",Model.Table1RowData)
@foreach (var Table2RowData in Model.Table2Rows) {
@Html.Partial("_Table2EditRowPartial",Table2RowData)
}
。部分视图是:
@model MyProject.Models.Model_x
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.LabelFor(model => model.prop_1)
@Html.EditorFor(model => model.prop_1)
@Html.ValidationMessageFor(model => model.prop_1)
...
@Html.LabelFor(model => model.prop_n)
@Html.EditorFor(model => model.prop_n)
@Html.ValidationMessageFor(model => model.prop_n)
<input type="submit" value="Save" />
}
@Html.ActionLink("Back to List", "Index")
我需要一种方法通过jQuery或.NET ajax帮助程序库异步提交所有表单。或者,如果我能有一个按钮来分割和编辑模型,然后将其重新组装到CompositModel
中并提交。它可以是 Razor 语法或其他任何东西,任何一个方法都可以,如果有内置的方式,我宁愿这样做,而不是扩展我的 lib 数据库。
与其将它们分成单独的形式并重新组合它们,为什么不只创建 1 个格式良好的表单来提交呢?欢迎来到EditorTemplates
的神奇世界!
1. 创建编辑器模板
在/Views/Shared/EditorTemplates/Model_x.cshtml
或[parent_root]/EditorTemplates/Model_x.cshtml
中创建编辑器模板
它看起来像这样。
@model MyProject.Models.Model_x
@Html.LabelFor(model => model.prop_1)
@Html.EditorFor(model => model.prop_1)
@Html.ValidationMessageFor(model => model.prop_1)
...
@Html.LabelFor(model => model.prop_n)
@Html.EditorFor(model => model.prop_n)
@Html.ValidationMessageFor(model => model.prop_n)
2. 在视图中使用编辑器模板。
它们将取代您对部分的使用(不适用于表单(,并且看起来像这样。
@model MyProject.Models.CompositeModel
@{
ViewBag.Title = "Edit";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Edit</h2>
@using (Html.BeginForm())
{
@Html.EditorFor(model => model.Table1RowData)
for (int i = 0; i < Model.Table2Rows.Count(); i++)
{
@Html.EditorFor(m => m.Table2Rows[i])
}
<p><input type="submit" /></p>
}
3. 成功!
当您发布表单时,您应该填写一个完整的模型MyProject.Models.CompositeModel
。