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

时间:2012-03-16 15:14:31

标签: asp.net-mvc list asp.net-mvc-3 view binding

我之前已经问过这个问题,但是我无法根据给出的答案获得正确的HTML。

相关问题:

以下是我的代码设置方式:

模型

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的示例项目,但我看不出他是如何获取参数名称的。

4 个答案:

答案 0 :(得分:1)

试试这个:

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

答案 1 :(得分:0)

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

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

并在您的视图中

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

答案 2 :(得分:0)

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

你经历一个像数组列表[0]等列表...但你不使用编辑器模板 或者你经历一个foreach(项目中的var项目)EditorFor(item)..并使用一个编辑器模板......但是你已经越过了我知道的两个可能导致它出错的方法。

所以试着改为做一个foreach,并检查结果。

答案 3 :(得分:0)

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

相关问题