【问题标题】:Custom List property not being updated from MVC View自定义列表属性未从 MVC 视图更新
【发布时间】:2012-05-16 17:41:42
【问题描述】:

我将 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 作为空值传递。

真的被这件事难住了。

【问题讨论】:

  • 查看生成的 HTML 并检查生成的 ID。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      如果您仍需要帮助,请发布您生成的 html sn-ps。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-15
        • 2011-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-05
        • 1970-01-01
        相关资源
        最近更新 更多