将模型数据从视图发布到控制器

时间:2013-10-29 13:26:18

标签: c# asp.net-mvc razor

我对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中的提交)。我已经尝试了很多不同的方法来做这个,但是当控制分数收到除项目之外的项目时,一切都为空.Id。

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

1 个答案:

答案 0 :(得分:0)

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

在主视图中:

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

假设您Items属性是ItemModel的集合(将其替换为您正在使用的类型),则创建EditorTemplate(必须位于Views/Shared/EditorTemplatesItemModel作为模型的{1}}文件夹:

@model ItemModel

@Model.Info @Html.EditorFor(model => model.Id)
@Html.EditorFor(model => model.Parameters)

假设Parameters&#39; type是ParameterModel的集合(再次使用您的真实类型),创建另一个EditorTemplate(仍位于Views/Shared/EditorTemplates文件夹中):

@model ParameterModel

@Model.Info @EditorFor(model => model.Value)

您的所有字段都将被正确命名,允许模型活页夹在您提交表单时获取正确的值。

现在,关于发生了什么的更多解释:模板(DisplayTemplateEditorTemplate,根据您的需要)给出了特定模型的表示,可以在所有模型中重复使用您的视图,并在您使用HtmlHelpers时自动调用(按照惯例,模板名称必须是类型名称)。 ASP.NET MVC已经有内置模板,适用于stringDateTime等类型(这就是为什么在使用@Html.Editor或{{1带有@Html.EditorFor属性的。)

boolean@Html.EditorFor一起使用时,会检查IEnumerable<ItemModel>是否存在EditorTemplate,并使用它来显示收藏中的每个ItemModel.cshtml 。它正确生成输入字段,以便在您提交时获取值。在此ItemModel中,您将显示其属性,包括EditorTemplate,它也是复杂类型的集合。然后,它再次搜索名为Parameters的{​​{1}}(在此示例中),并使用它来显示每个参数。

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

这一强大功能有助于保持代码清晰,同时在构建视图时提供灵活性。请注意,这些模板具有特定的位置:string(或int)或Views/Shared/EditorTemplatesViews/Shared/DisplayTemplates)。