2011-06-07 62 views
4

我在遇到子屬性時遇到了默認的模型綁定命名約定。例如:MVC模型綁定命名約定的子對象?

我有一個視圖模型看起來是這樣的:

public class UserViewModel 
{ 
    public User BusinessObject { get; set; } 
} 

我的User類有一個名爲 「NetworkLogin」

我的視圖具有這樣的特性: <%: Html.LabelFor(model => model.BusinessObject.NetworkLogin)%> <%:Html.TextBoxFor(model => model.BusinessObject.NetworkLogin)%> 自動填充

而且我的控制,我想幹什麼,是

[HttpGet] 
    public ActionResult UserIndex(string networkLogin) { } 

問題: 輸入參數「networkLogin」總是空。這是有道理的,因爲html元素上的實際參數是name =「BusinessObject.NetworkLogin」和id =「BusinessObject_NetworkLogin」。但是,我不知道在我的操作方法中應該使用什麼參數名稱。我試過「businessObject_NetworkLogin」,它也不起作用。

但是,我有這種解決方法可以工作,但我不喜歡它。我添加到我的ViewModel:

public string NetworkLogin 
    { 
     get 
     { 
      if (BusinessObject == null) 
       BusinessObject = new User(); 
      return BusinessObject.NetworkLogin; 
     } 
     set 
     { 
      if (BusinessObject == null) 
       BusinessObject = new User(); 
      BusinessObject.NetworkLogin = value; 
     } 
    } 

而我的查看頁面現在說這個。 <%:Html.TextBoxFor(model => model.NetworkLogin)%>

有人能告訴我默認的模型綁定是什麼適當的命名約定,所以我不必採用上述解決方法?

謝謝!

回答

11

指明前綴,以便模型綁定都知道,BusinessObject.NetworkLogin查詢字符串參數實際上是指networkLogin這是你作爲行動參數

public ActionResult UserIndex(
    [Bind(Prefix = "BusinessObject")] string networkLogin 
) 
{ 
    ... 
} 

用什麼或重用您的視圖模型:

public ActionResult UserIndex(UserViewModel model) 
{ 
    // TODO: use model.BusinessObject.NetworkLogin 
    // which is gonna be correctly bound here 
    ... 
} 

就你的解決方法而言,一旦你將我的兩個建議中的一個付諸行動,你的視圖模型屬性應該看起來像這樣:

public string NetworkLogin { get; set; } 
+0

這看起來應該可以工作,但我決定使用一些ajax調用,所以我不願意讓我的項目準備好嘗試以上。 – Raymond 2011-06-09 21:58:37

+4

Darin的+1看起來像一個很好的答案。雷蒙德,你至少可以做的就是在舊版本上試試這個。 – 2011-08-03 11:53:51