2012-08-28 53 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)