1

我对 MVC 很陌生,但遇到了一些问题:

我有一个视图,它有 2 个用于显示数据的 foreach 循环。就像是:

foreach(var item in Model.items){
using (Html.BeginForm("ActionName","ControllerName")){
<div>
@item.Info @Html.EditorFor(i => i.Id)
    foreach(var parameter in item.parameters){
    @parameter.Info @EditorFor(param => parameter.Value)
}
<input type="submit" value="Update" />
</div>
}
}

到目前为止一切顺利......我想允许用户编辑其中一个项目中的参数值并按提交(可以是每个项目 div 中的提交)。我已经尝试了许多不同的方法来执行此操作,但是当控制器操作收到除 item.Id 之外的项目时,一切都为空。

这只是错误的做法还是我错过了什么?

4

1 回答 1

0

foreach不会为您的输入生成正确的名称,因此在您提交时模型绑定器无法识别它。您可以使用 forfor循环(提供正确的索引),但我建议您使用EditorTemplates

在您的主视图中:

@Html.EditorFor(model => model.Items)

假设您Items的属性是一个集合ItemModel(用您使用的类型替换它),您创建一个EditorTemplate(必须位于Views/Shared/EditorTemplates文件夹中),它采用ItemModelas 模型:

@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 已经有内置模板,用于 , 等类型(这就是为什么在使用或使用属性时会得到一个复选框)。EditorTemplateHtmlHelpersstringDateTime@Html.Editor@Html.EditorForboolean

当您@Html.EditorFor与 an 一起使用时IEnumerable<ItemModel>,它会检查一个EditorTemplate命名是否ItemModel.cshtml存在,并使用它来显示ItemModel您的集合中的每个。它正确生成输入字段,以便在您提交时取回值。在这个EditorTemplate中,您显示它的属性,包括Parameters它也是一个复杂类型的集合。然后,它再次搜索EditorTemplate被调用ParameterModel.cshtml(在本例中),并使用它来显示每个参数。

如果没有定义模板,它使用对象类型的默认模板,它只显示简单的属性(如stringint...)。

这个强大的功能有助于保持代码清晰,同时在构建视图时提供灵活性。请记住,这些模板具有特定的位置:要么Views/Shared/EditorTemplates(或Views/Shared/DisplayTemplates),要么Views/{MyControllerName}/EditorTemplatesViews/{MyControllerName}/DisplayTemplates)。

于 2013-10-29T14:01:58.530 回答