将复杂模型绑定到 MVC3 中的列表

Posted

技术标签:

【中文标题】将复杂模型绑定到 MVC3 中的列表【英文标题】:Binding a complex model to a list in MVC3 【发布时间】:2012-03-16 15:14:30 【问题描述】:

我知道以前有人问过这个问题,但我无法根据给出的答案获得正确的 html

相关问题:

Complex model binding to a list How ASP.NET MVC: How can I bind a property of type List<T>?

这是我的代码的设置方式:

型号

public class CustomerOrderItem 
    public List<CustomerOrderItemSerialNumber> CustomerOrderItemSerialNumbers  get; set; 
    public int Id  get; set; 
    public string ShipperId  get; set; 
    public string OrderLineNumber  get; set; 
    public string LineNumber  get; set; 

    /// <summary>
    /// Return either an empty string (if no serial numbers already exist) or return the list of serial numbers separated by a line break for display in a textarea input.
    /// </summary>
    public string SerialNumber  get  return CustomerOrderItemSerialNumbers == null ? string.Empty : string.Join("\r\n", CustomerOrderItemSerialNumbers.Select(i => i.SerialNumber));  

查看

<table id="orderItems" class="grid">
    <thead>
        <tr class="gridHeader">
            <th class="lineNumber">Line #</th>
            <th class="quantity">Quantity</th>
            <th class="sku">SKU</th>
            <th class="description">Description</th>
            <th class="serialNumber">Serial Number(s)</th>
        </tr>
    </thead>
    <tbody>
        @for (int i = 0; i < Model.Count; i++) 
            @Html.EditorFor(m => m[i])
        
    </tbody>
</table>

编辑器

<tr class="gridrow">
    <td class="lineNumber">@Model.LineNumber</td>
    <td class="quantity">@Model.QuantityOrdered</td>
    <td class="sku">@Model.SKU</td>
    <td class="description">@Model.Description</td>
    <td class="serialNumber">
        @Html.TextAreaFor(m => m.SerialNumber)
    </td>
</tr>

此设置会生成以下 HTML(仅发布相关部分):

<td class="serialNumber">
    <textarea cols="20" name="[0].SerialNumber" rows="2"></textarea>
</td>

名称始终呈现为 [0].SerialNumber,但我需要 orderItem[0].SerialNumber。我查看了 Phil Haack 的示例项目,但没有看到他是如何渲染参数名称的。

【问题讨论】:

您的视图的模型是如何定义的? @jrummell - 我更新了我的问题。 SerialNumber 属性有点不同,因为它实际上基于类中的另一个属性。它基本上是作为一个友好的视图属性。 你能展示你的Action方法(至少是参数)吗? @jrummell - 我什至还没有尝试将数据发布到我的操作,因为我想先解决标记。 @jrummell - 我还应该提到这个视图在页面上呈现为部分。因此CustomerOrderItem 的列表作为模型传递给局部视图。 【参考方案1】:

试试这个:

@Html.EditorFor(m => m[i], new ViewDataDictionary()  TemplateInfo = new TemplateInfo()  HtmlFieldPrefix = "orderItem"  )

【讨论】:

这仍然会导致呈现相同的 HTML。 真的吗?我正在使用这种方法,并且工作正常。您在视图中的 for 循环中用您的 EditorFor 行替换了我的代码,对吧? 是的,我替换了那行。看起来这需要编辑器模板与我所拥有的有点不同,对吧?您的编辑器模板可能会查找 ViewData? 不,我使用强类型模型。 @MarinHN - 感谢您的帖子。我刚刚弄清楚我的问题是什么。我将我的项目列表传递给局部视图,以使我的原始视图看起来更加简洁明了。如果您将列表作为模型传递给局部视图并尝试渲染它,MVC 不会自动将该参数名称添加为输入名称的一部分。【参考方案2】:

在模型中使用@Html.EditorFor()[DataType] 属性来说明它应该呈现为文本区域

[DataType(DataType.MultilineText)]
public string SerialNumber get; set; 

在你的视野中

@Html.EditorFor(m => m.SerialNumber)

【讨论】:

【参考方案3】:

如果您要使用数组索引,我认为您不需要编辑器模板,但既然您有编辑器模板,请改用“foreach”。试一试,告诉我结果。据我所知,模型列表绑定有两种方法:

您通过一个列表,如数组列表 [0] 等...但您不使用编辑器模板 或者你通过一个 foreach(var item in items) EditorFor(item).. 并使用一个编辑器模板......但是你已经跨越了我知道的两种方法,这可能会导致它出错。

所以尝试只做一个 foreach,然后检查结果。

【讨论】:

【参考方案4】:

我将我的项目列表传递给局部视图,以使我的原始视图看起来更加简洁明了。如果您将列表作为模型传递给局部视图并尝试渲染它,MVC 不会自动将该参数名称添加为输入名称的一部分。

【讨论】:

以上是关于将复杂模型绑定到 MVC3 中的列表的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从剃刀视图传递到 mvc3 中的控制器?

将 ListBoxFor 绑定到 MVC 3 中的模型并使用另一个模型自动选择多个项目

如何绑定到列表作为 MVC 3 Razor 中模型上的属性?

MVC Radiobutton 绑定复杂对象

如何在 Mvc3 中填充 ListBoxFor?

有没有办法将复选框列表绑定到 asp.net mvc 中的模型