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

本文关键字:控制器 视图 模型 数据 | 更新日期: 2023-09-27 18:37:13

我是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 之外的项目时,一切都为空。

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

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

foreach不会

为您的输入生成正确的名称,因此在您提交时,模型绑定程序无法识别它。你可以使用for循环(它给出了正确的索引),但我建议你使用EditorTemplates

在您的主视图中:

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

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

@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)

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

现在,关于正在发生的事情的更多解释:模板(根据您的需要DisplayTemplateEditorTemplate)给出了特定模型的表示形式,该模型可在您的所有视图中重用,并在您使用HtmlHelpers时自动调用(按照惯例,模板名称必须是类型名称)。 ASP.NET MVC 已经有内置模板, 对于 stringDateTime 等类型(这就是为什么当您将 @Html.Editor@Html.EditorForboolean 属性一起使用时会出现一个复选框)。

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

如果未定义模板,则使用对象类型的默认模板,该模板仅显示简单属性(如stringint...)。

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