2010-03-23 76 views
3

MVC新手問題綁定器。假如我有兩個強類型碰巧有一個同名的模型屬性局部行動,並在同一個包含頁面即呈現:綁定,前綴和生成的HTML

Class Friend {string Name {get; set ;} DateTime DOB {get; set ;}} 
Class Foe {string Name {get; set ;} string ReasonForDislike {get; set ;}} 

兩個泛音將有一行:

<%= Html.TextBoxFor(model => model.Name) %> 

和相關的控制器操作:

public ActionResult SaveFriend(Friend friend) 
public ActionResult SaveFoe(Foe foe) 

我的問題是,無論是將呈現包含我的網頁上使用相同的ID(當然,壞的原因很多)。我知道[綁定]屬性,允許我添加前綴,導致代碼:

public ActionResult SaveFriend([Bind(Prefix = 「friend」)] Friend friend) 
<%= Html.TextBox("friend.Name", Model. Name) %> //Boo, no TextBoxFor :(

但是,這仍然不能削減它。我只差一點就容忍強類型TextBoxFor傭工的損失,但我還沒有得到客戶端驗證與前綴的工作: 我已經試過:

<%= Html.ValidationMessage("friend.Name") %> 

......和所有其他變種我能想到的。

我似乎需要模型知道在兩個方向的前綴,但綁定僅適用於映射入站請求。在我看來,這是一種常見的情況,但我正在努力尋找那些例子。我錯過了什麼!

在此先感謝。

回答

2

前綴在那裏,所以你可以將你的對象包裹在一個「外部」ViewModel中。

假設我們有:

public class MyViewModel 
{ 
    public Friend friend; 
    public Foe foe; 
} 

如果你使用這個類作爲您的視圖模型,併爲您的強類型的意見,那麼你的強類型的文本框將被正是如此命名的基礎:

friend.Name 
foe.Name 

然後,您可以使用您在問題中引用的前綴屬性來消除朋友和敵人類之間的歧義。

+0

非常感謝,是的綁定屬性僅用於映射請求,我覺得這是錯誤的,但在這一點上抓着吸管!我沒有考慮創建一個包裝類來影響渲染。我必須承認,爲了讓視圖正常工作而爲域對象創建多餘的包裝並不是一件容易的事,但它肯定能解決我眼前的問題。能夠在應用於請求和響應的模型中指定前綴將會很好。 謝謝你讓我再次跑步! – Vman 2010-03-23 11:27:59

+1

很高興我能幫到你。僅供參考 - 您不必*創建ViewModels,但它在MVC上運行得更好,它有點迫使您編寫更好的代碼。問題不在於風格,而在於缺乏工具。 ViewModel的創建不應該是這樣一個勞動密集型的過程,但它仍然是ASP.NET MVC的早期版本(和版本)...... – 2010-03-23 12:39:44