foreach
不会为您的输入生成正确的名称,因此在您提交时模型绑定器无法识别它。您可以使用 forfor
循环(提供正确的索引),但我建议您使用EditorTemplates
:
在您的主视图中:
@Html.EditorFor(model => model.Items)
假设您Items
的属性是一个集合ItemModel
(用您使用的类型替换它),您创建一个EditorTemplate
(必须位于Views/Shared/EditorTemplates
文件夹中),它采用ItemModel
as 模型:
@model ItemModel
@Model.Info @Html.EditorFor(model => model.Id)
@Html.EditorFor(model => model.Parameters)
并假设Parameters
' 类型是ParameterModel
(再次,使用你的真实类型)的集合,创建另一个EditorTemplate
(仍然位于Views/Shared/EditorTemplates
文件夹中):
@model ParameterModel
@Model.Info @EditorFor(model => model.Value)
您的所有字段都将正确命名,从而允许模型绑定器在您提交表单时获取正确的值。
现在,对正在发生的事情进行更多解释:模板(根据您的需要,可以是DisplayTemplate
或name 必须是类型名称)。ASP.NET MVC 已经有内置模板,用于 , 等类型(这就是为什么在使用或使用属性时会得到一个复选框)。EditorTemplate
HtmlHelpers
string
DateTime
@Html.Editor
@Html.EditorFor
boolean
当您@Html.EditorFor
与 an 一起使用时IEnumerable<ItemModel>
,它会检查一个EditorTemplate
命名是否ItemModel.cshtml
存在,并使用它来显示ItemModel
您的集合中的每个。它正确生成输入字段,以便在您提交时取回值。在这个EditorTemplate
中,您显示它的属性,包括Parameters
它也是一个复杂类型的集合。然后,它再次搜索EditorTemplate
被调用ParameterModel.cshtml
(在本例中),并使用它来显示每个参数。
如果没有定义模板,它使用对象类型的默认模板,它只显示简单的属性(如string
,int
...)。
这个强大的功能有助于保持代码清晰,同时在构建视图时提供灵活性。请记住,这些模板具有特定的位置:要么Views/Shared/EditorTemplates
(或Views/Shared/DisplayTemplates
),要么Views/{MyControllerName}/EditorTemplates
(Views/{MyControllerName}/DisplayTemplates
)。