3

因此,我正在從MVC 1.0轉移到MVC 2.0 RTM。我想開始遵循的其中一個約定是使用強類型的HTML助手來生成文本框等控件。與強類型的HTML幫手POST POST ASP MVC2模型綁定問題

但是,它看起來不會是一個簡單的跳躍。我試圖遷移我的第一個形式,更換線路是這樣的:

<%= Html.TextBox("FirstName", Model.Data.FirstName, new {maxlength = 30}) %> 

...的線路是這樣的:

<%= Html.TextBoxFor(x => x.Data.FirstName, new {maxlength = 30}) %> 

此前,這將映射到一個POST其相應的視圖模型,使用以下方法簽名:

[HttpPost] 
public ActionResult Registration(AccountViewInfo viewInfo) 

相反,它目前得到一個空的對象。我相信,斷開是在我們通過視圖模型到有一些網頁的元數據和其他有趣的東西與它一起(因此x.Data.FirstName而不是x.FirstName)較大的聚合對象的事實

所以我的問題是:什麼是最好的方式來使用強類型的助手,同時仍然允許MVC框架適當地將表單集合轉換爲我的視圖模型,就像它在原始行中一樣嗎?有沒有辦法在不改變我們傳遞給?!查看

感謝

UPDATE:所以綁定屬性WO很好,但我不喜歡我如何將它應用到基本上每個發佈的視圖模型。我最終改變了繼承層次結構,使得我們所有的視圖模型都從包含頁面內容和其他元數據的基類繼承,而不是作爲名爲Data的聚合屬性。

回答

5
public ActionResult Registration([Bind(Prefix = "data")] AccountViewInfo viewInfo); 

這告訴它應該期望所有的值開始數據粘結劑,所以它會尋找data.FirstName

+0

+1因爲這肯定會工作。雖然我很好奇,是否有任何方法可以在全球範圍內實施這一更好的方法?如果我可以避免,我寧願不在每個POST中手動添加'[Bind]'屬性。如果我可以在基本控制器中強制執行它,或者檢查非表單集合引用類型的某種類級屬性,那將會非常棒。 – 2010-04-12 13:30:47

+2

將FirstName屬性添加到模型本身,因此您將使用x => x.FirstName而不是x => x.Data.FirstName進行綁定。 – mxmissile 2010-04-12 13:37:05

+1

@mxmissile可以修復它,但實際的'Model'是一個強類型容器,強類型應用於'Data'屬性。所以從一個架構的角度來看,在這種情況下我不適合我。 – 2010-04-12 13:56:40