2012-08-28 54 views
8

我有一个复杂的类型,即用户/地址/地址的列表中选择模型MVC Html.DisplayNameFor在一个复杂的模型

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街道/城市/州不起作用。

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

TIA Ĵ

+0

尝试使用简单的'for'循环,而不是'foreach'。 –

+0

会发生什么?@ Html.DisplayNameFor(m => Model.Addresses.Street.First())'?我通常只是手动输入标签。 –

+0

我想使用名称的数据注解。试图始终保持代码之外的字符串。 –

回答

9

我改变

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

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

不要使用@Html.DisplayNameFor(m => Model.Addresses[0].Street),因为如果你需要编辑的第一行,你将不能够这样。

现在一切都按预期工作。

+0

当我尝试使用[0]时,它给我一个运行时错误“无法对[]应用索引到'System.Data.Objects.DataClasses类型的表达式。EntityCollection

'“ – ThatAintWorking

+2

如果地址为空将会怎样?当@model指令被赋予一个IEnumerable 时,它会计算出来...... – Dean

0

您使用DisplayNameFor的方式是错误的。 Addresses是一个列表,它不具有像StreetCityState的属性。所以你如何期待这个名字被显示。

在这种情况下,直接使用视图中的名称而不是使用helper并不那么简单。

+1

那么你的解决方案是什么? – Zapnologica

1

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

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

而下面的错误消失了。

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

但是最好还是使用名称直接使用以下语句

@Html.DisplayName("Street") 
1

这可能是更好的:

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

也将在案件的工作列表是空

+1

如果列表为空,是不是会导致NRE? – TZHX

+0

它不会工作列表是空的 –

0

要显示地址属性的名称,您可以定义一个空的Adress模型

{ 
    var adress =new Models.Address(); 
} 

,并使用它像这样

@Html.DisplayNameFor(m => adress.Street)