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

时间:2012-05-16 17:41:43

标签: c# .net asp.net-mvc asp.net-mvc-3 entity-framework

我正在使用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作为空值传递。

真的很难过。

3 个答案:

答案 0 :(得分:3)

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

由于您没有在lambda中使用该模型(model => m.Name&lt; - 请注意您未使用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属性现在应包含该完整路径。因此,在保存时,数据现在应该在那里。

答案 1 :(得分:0)

结帐Phil Haack's MVC binding to a list。它拥有您需要的所有信息。

答案 2 :(得分:0)

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

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

无论何时深入了解具有属性属性的模型,您都需要调整名称,如上所示,或者创建一个新的htmlhelper扩展来处理您的对象,这样您就可以使用@ Html.DisplayFor(m = &gt; m.Marketing),或者您也可以在控制器中编写一个自定义模型绑定器来修复此名称匹配,您还可以访问控制器上下文中的Request对象,以便您可以选择表单元素发布了。

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