0

我将 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>

}

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

真的被这件事难住了。

4

3 回答 3

3

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

由于您没有在 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属性现在应该包含该完整路径。因此,保存后,数据现在应该在那里。

于 2012-05-16T17:47:04.890 回答
0

查看Phil Haack 的 MVC binding to a list。它包含您需要的所有信息。

于 2012-05-16T17:46:14.563 回答
0

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

对于 List/Collection 对象,您可以使用数组类型的索引来指定特定项目。例如,如果您的字段要绑定到 Model.Marketing.Mail,则名称应该类似:“Marketing[2].Mail”。

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

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

于 2012-05-16T17:50:50.480 回答