2015-05-19 72 views
-1

我有一個關於在視圖上表示覆雜視圖的問題。由於我的代碼已經很複雜,爲了尋求答案,我想出了一個簡單的模型。在視圖上表示覆雜類型

例如如果我想使用HTML輔助顯示的名字一個TextBox那麼這將工作

@Html.TextBoxFor(model => model.FirstName, new { @class = "Name" }) 

我有認爲這是我的模型類和複合型

public class Person 
{ 
    public string FirstName { get; set; } 
    public string Surname { get; set; } 
    public string Phone { get; set; } 
    public List<Address> Address {get; set;} 
} 

[ComplexType] 
public class Address 
{ 
    public string Street { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
} 

問題現在呈現爲地址'街道屬性的文本框。我不想將其硬編碼到視圖中,我更願意使用Lambda表達式來獲取街道,城市和州的文本框。雖然這個語法是錯誤的,這裏就是我試圖完成

@Html.TextBoxFor(model => model.Address.Street, new { @class = "Name" }) 

或者東西在C#中的法律是抽象會從我輸入輸入姓名權控制到輔助方法。這是因爲在爲我的項目使用模型綁定時,我不希望在我的模型更改後返回我的視圖以硬編碼輸入名稱。

UPDATE 地址是List類型。我更新了代碼,以反映地址是我的代碼中的類型地址列表的事實。

+1

您是否嘗試過'@ Html.EditorForModel'?請參閱http://stackoverflow.com/questions/6537220/why-not-use-html-editorformodel。 –

+0

你用'Html.TextBoxFor(m => m.Address.Street)給出的例子'看起來對我有效。它不適合你嗎?也許我誤解了你的問題。 – Peter

+0

'Html.TextBoxFor(m => m.Address.Street)'不適合我。我編輯了我的問題,以反映我認爲是什麼問題。讓地址成爲一個列表

Dev

回答

1

使用MVC,您可以設置視圖以期望特定的模型。如果你這樣做,無論多麼複雜,你都可以在模型上獲得完整的Intellisense。我更喜歡用這種方法來減弱所有的字符串模型,使它更容易綁定。

這裏是一個快速文章中,我發現了強類型的觀點:http://www.c-sharpcorner.com/UploadFile/abhikumarvatsa/strongly-typed-views-in-mvc/

看看是否給你上取得進展的一些想法。

+0

我編輯了代碼,地址是我的模型類中的一個列表

類型。 – Dev

0

您可以使用定製的EditorTemplate來輸入Address或使用for循環。

/Views/Shared/EditorTemplates/Address.cshtml

@model yourAssembly.Address 
@Html.TextBoxFor(m => m.Street, new { @class = "Name" }) 
@Html.TextBoxFor(m => m.City, new { @class = "Name" }) 
.... 

,並在主圖

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

,或者使用在主視圖中一個for

for(int i = 0; i < Model.Address.Count; i++) 
{ 
    @Html.TextBoxFor(m => m.Address[i].Street, new { @class = "Name" }) 
    @Html.TextBoxFor(m => m.Address[i].City, new { @class = "Name" }) 
    .... 
} 

兩個選項將產生正確的名稱屬性,以便例如,你的收藏會在郵寄後重新綁定mple

<input name="Address[0].Street" .../> 
<input name="Address[1].Street" .../> 

邊注:建議你使用集合多種命名 - public List<Address> Addresses { get; set; } - 因此它更加明顯,你的屬性是一個集合,而不是一個單一的對象

+0

我在我的創建視圖中使用該代碼,因此'Model.Address.Count'不會適用。我想使用第一個建議,就像我在某個帖子中看到的一樣,但是編譯器抱怨視圖中有兩個@model語句 – Dev

+0

爲什麼你有2個@model語句?所有你需要的是'@model yourAssembly.Person' –

+0

並不確定你的意思是_「Model.Address.Count將不適用」_?如果你正在創建一個新的人,那麼你需要添加至少一個'地址'對象到你的集合,所以你可以編輯它。如果你想在視圖中動態地添加多個Address對象,那麼你需要一個完全不同的方法,涉及到javascript/jquery(但是在你的問題中沒有提及) –