未从 MVC 视图更新自定义列表属性

本文关键字:列表 属性 自定义 更新 MVC 视图 未从 | 更新日期: 2023-09-27 18:34:27

我正在将EF与MVC3一起使用。

我有一个带有自定义列表的模型:

public List<MarketingModel> Marketing { get; set; }

我在构造函数中将其初始化为:

 this.Marketing = new List<MarketingModel>();

我在视图中查看它:

@foreach (MarketingModel m in Model.Marketing)
{
 <td class="title">@Html.DisplayFor(model => m.Name)</td>
 <td>@Html.CheckBoxFor(model => m.Mail)</td>
 <td>@Html.CheckBoxFor(model => m.Email)</td>
}

填充良好。但是,在保存页面时,无论出于何种原因,它都会将营销作为空值传递。

真的难倒了。

未从 MVC 视图更新自定义列表属性

不要使用 foreach 循环。 XXXFor帮助程序方法使用表达式树,这些表达式树旨在确定从模型中到属性的属性路径。 此属性路径用于在相应的 HTML 输入元素上构造 name 属性。

由于您没有在lambda中使用模型(model => m.Name <-请注意,您没有使用model(,因此属性路径不正确。 相反,请使用for循环:

@for (int i = 0; i < Model.Marketing.Count; i++) 
{
    <td class="title">@Html.DisplayFor(model => Model.Marketing[i].Name)</td>
    <td>@Html.CheckBoxFor(model => Model.Marketing[i].Mail)</td>
    <td>@Html.CheckBoxFor(model => Model.Marketing[i].Email)</td>
}

这样,属性的整个路径都包含在表达式树 ( Model.Marketing[i].Name ( 中,相应的 name 属性现在应该包含该完整路径。 因此,在保存时,数据现在应该在那里。

查看 Phil Haack 的 MVC 绑定到列表。 它有你需要的所有信息。

因为你有一个将新范围设置为 Model.Marketing 的 foreach,所以你的帖子混淆了 MVC 绑定。我会检查创建的 HTML 并注意那些有问题的字段的 name 属性。该名称必须与其他模型属性的模式相同。

对于列表/集合对象,可以使用数组类型的索引来指定特定项。 例如,如果您的字段要绑定到 Model.Marketing.Mail,则名称应类似:"Marketing[2]。邮件"。

每当使用属性的属性深入研究模型时,都需要调整名称,如上所示,或创建新的 htmlhelper 扩展来处理您的对象,以便您可以使用类似 @Html.DisplayFor(m => m.Marketing( 的内容,或者您也可以在控制器中编写自定义模型绑定器来为您修复此名称匹配, 您还可以访问控制器上下文中的 Request 对象,以便挑选已发布的表单元素。

如果您仍然需要帮助,请发布生成的 html 代码段。