2014-11-21 60 views
1

類型不同我有兩種型號:提交模型來動作即從視圖模型的

public class PersonViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Title { get; set; } 
} 

public class DetailViewModel 
{ 
    public IEnumerable<string> Titles { get; set; } 
    public PersonViewModel Person { get; set; }   
} 

的形式呈現兩個字段,所述第一字段是所述Name,第二場是的一個下拉Titles(先生,夫人小姐。等)

此頁的視圖是強類型到DetailViewModel,並且在控制器的Save方法接受PersonViewModel類型的參數。

由於視圖強制類型爲不同與action的參數類型不同,因此HttpRequest中的名稱與MVC在操作中所期望的名稱不匹配。

是否有可能讓MVC正確綁定模型不匹配沒有不得不手動指定表單字段名稱? (如:我還是想用@Html.TextBoxFor(m => m.Person.Name)

爲了澄清,正在提交的表單字段名稱類似於以下內容:

Person.Name =馬修& Person.Title =先生。

,我需要以下(爲模型綁定工作):

名稱=馬修&標題=先生。

+0

廣東話您保存方法接受一個'DetailViewModel'? – Shoe 2014-11-21 21:25:47

+0

我可以,但是當我必須進行驗證時,事情開始變得混亂。實際發佈的數據是'Person'內的所有內容,沒有別的。 – Matthew 2014-11-21 21:31:42

回答

5

您可以使用BindAttributePrefix財產的操作方法

public ActionResult Edit([Bind(Prefix="Person")]PersonViewModel model) 
{ 
} 

這基本上去掉從屬性名Person前綴,而結合

+0

那太快了!這看起來正是我想要的。超時過期時我會接受。 – Matthew 2014-11-21 21:27:28

+0

我有一個問題。一般來說,可以使用'BindAttribute'來強制MVC接受與View中處理的模型不同的模型嗎? – Celdor 2014-11-21 21:46:00

+0

只有模型的一個子集傳遞給視圖。除了'前綴'之外,[BindAttribute](http://msdn.microsoft.com/zh-cn/library/system.web.mvc.bindattribute%28v=vs.118%29.aspx)可以包含「Include」或'從綁定過程中排除'模型屬性。不確定你在想什麼,但是如果你想更好地控制綁定過程,你總是可以創建你自己定製的'ModelBinder' – 2014-11-21 21:53:56