2011-02-08 68 views
1

我有一個自定義模型綁定器來處理我的accountRequest類。 該類由一些布爾值和一個UserViewModel組成。幫助ModelBinding中的複雜對象.net

UserViewModel由諸如Firstname,Last Name,Address之類的字符串組成。

最初我只是通過UserViewModel作爲操作參數,但我現在需要在AccountRequest中封裝UserViewModel。但是,現在我的模型綁定器不會將httpContext.Request中的字符串映射到AccountRequest中的我的UserViewModel。所有的布爾值映射都很好。

是否有一種簡單的方法可以將他的數據映射到UserViewModel屬性,而不是對其進行硬編碼?

我試過這個,但我不喜歡它。 (簡體)

Dim accountRequest As New AccountRequest 
Dim user As New UserViewModel 

If Not String.IsNullOrEmpty(controllerContext.HttpContext.Request("Firstname")) Then 
    user.FirstName = controllerContext.HttpContext.Request("Firstname") 
End If 

accountRequest.CurrentUser = user 
Return accountRequest 

很明顯,任何幫助,非常感謝。提前致謝!

回答

0

對不起 - 只是意識到,你的代碼是VB和我在C#回答

這可能是因爲模型綁定現在正在modelname.property而不是僅僅property在ValueProviders和,此前,因爲它是一個直接的操作方法參數,所以它一直在尋找property

現在的模式類型爲的另一個成員,其屬性名稱將被用作一個前綴和我不相信您可以刪除要求(可以嘗試Bind(Prefix="")的參數,但我不認爲這將工作)。

這是假設你不是自定義綁定每個屬性,而DefaultModelBinder正在爲你做這些屬性的一部分。

您應該可以在不更改代碼的情況下通過將您的查詢字符串更改爲?modelname.property=[value]來使其工作。如果您使用的是表單,那麼您應該考慮使用Html.EditorFor擴展方法 - 因爲它會處理模型命名(只要您的ViewModel成員名稱和輸入模型名稱一致)。但是,從查詢字符串的例子:

public class MyObject{ 
    public string StringValue { get; set; } 
} 

public class MyObjectOuter{ 
    public MyObject Nested { get; set; } 
} 

public ActionResult Index(MyObjectOuter obj); 

的obj.Nested.StringProperty值可以填充:/Index?Nested.StringValue=hello%20world因爲obj前綴是隱含的反正。

如果你不喜歡這個,你有兩個選擇:

1)改變方法的簽名需要兩個參數:

public ActionResult Index(MyObjectOuter outer, MyObject nested) 

然後在身體,你馬上將nested複製到obj.Nested屬性。這有點冒險 - 但它會起作用。

2)手動強制綁定類的屬性以使用ValueProviders中的非前綴值(但那麼您將限制模型類型僅適用於特定類型的請求 - 這不完全靈活) 。 3)或者,就像我之前所說的那樣,如果這些屬性是從Http窗體綁定的,請使用Html.EditorFor生成標記 - 它會自動生成具有正確名稱的輸入,只要它們不會從輸入更改 - >輸出。