复杂模型上的MVC Html.DisplayNameFor

时间:2012-08-28 22:15:28

标签: asp.net-mvc-4 razor

我有一个复杂类型的模型,即用户/地址/地址列表

public class User{
public List<Address> Addresses{get;set;}
}

在我的视图中我正在显示此

<fieldset><legend>@Html.DisplayNameFor(model=>model.Addresses)</legend>
<table>       
<tr>
    <th>
        @Html.DisplayNameFor(m => Model.Addresses.Street)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Addresses.City)
    </th>
<th>
        @Html.DisplayNameFor(model => model.Addresses.State)
    </th>

    </tr>
@foreach (var item in Model.Addresses) {    
<tr>
    <td>
        @Html.DisplayFor(m => item.Street)
    </td>
    <td>
        @Html.DisplayFor(m => item.City)
    </td>
    <td>
        @Html.DisplayFor(m => item.State)
    </td>
</tr>
} 
    </table></fieldset>

DisplayNameFor Street / City / State不起作用。

在子对象上获取DisplayNameFor的正确方法是什么?

TIA Ĵ

4 个答案:

答案 0 :(得分:10)

我改变了

@Html.DisplayNameFor(m => Model.Addresses.Street)

@Html.DisplayNameFor(m => Model.Addresses.FirstOrDefault().Street)

请勿使用@Html.DisplayNameFor(m => Model.Addresses[0].Street),因为如果您需要编辑第一行,则无法通过这种方式进行编辑。

现在一切正常。

答案 1 :(得分:1)

您也可以使用Linq来避免索引错误。我用这是我的代码 -

@Html.DisplayNameFor(m => Model.Addresses.first().Street)

以下错误消失了。

Cannot apply indexing with [] to an expression of type 'System.Data.Objects.DataClasses.EntityCollection<Address>

然而,最好使用以下语句直接使用Name

@Html.DisplayName("Street")

答案 2 :(得分:1)

这可能更好:

@Html.DisplayNameFor(m => Model.Addresses.FirstOrDefault().Street)
如果列表为空,

也会起作用

答案 3 :(得分:0)

您使用DisplayNameFor的方式是错误的。 Addresses是一个列表,它没有StreetCityState等属性。所以你希望如何显示这个名字。

在这种情况下,不是直接使用视图中的名称而不是使用帮助器。

相关问题