2012-11-06 178 views
1

我有一個關於viewModel中屬性組織的問題。據我所知,viewmodel應該儘可能簡單,它應該做的主要事情是綁定數據以查看。MVC 3 viewmodel屬性

問題是如何從BL模型中區分viewmodel中的屬性。 我的意思是,比如我有一個BL模型,如:

public class UserDetailsModel 
    { 
     public string UserName {get;set;} 
     public string SomeInfo{get;set;} 
     public string AnotherInfo{get;set;} 
     public string Anything{get;set;} 
     public string Something {get;set;} 
     ... 

    } 

然後我還有一個BL模型說:

public class UserInfoModel 
     { 
      public string Info1{get;set;} 
      public string Info2{get;set;} 
      public string Info3{get;set;} 
      public string Info4{get;set;} 
      public string Info5 {get;set;} 
      ... 

     } 

現在的問題是什麼是創建視圖模型應該有數據的最佳實踐的兩個BL模型。

1)複製2個模型中的屬性,並使用默認模型綁定將數據從視圖傳輸到控制器,然後從ViewModels和存儲庫更新數據創建BL模型?在這種情況下,我們有重複代碼...

2)視圖模型應該是這個樣子:

public class UsersIdentificationViewModel 
     { 
      public UsersIdentificationViewModel() 
      { 
       UserInfoModel = new UserInfoModel(); 
      } 

      public UserInfoModel UsersInfo { get; set; } 

      public UserDetailsModel UserDetails { get; set; } 

     } 

默認綁定不會在這種情況下(糾正我,如果我誤),我應該寫工作自定義模型聯編程序或類似的東西...什麼方法對單元測試更好,或者有另一種方法?

+0

您的選項2可以工作。支持嵌套視圖模型。你試過了嗎? –

+0

我會試試這種方式,謝謝 – StringBuilder

回答

0

如果您需要使用視圖模型中BL模型的屬性,最佳選擇是將BL模型作爲屬性嵌入到視圖模型中。正如你所說的那樣,你將避免重複屬性名稱,這顯然是件好事。

public class UsersIdentificationViewModel 
{  
    public UserDetailsModel UserDetails { get; set; }   
    public UserInfoModel UsersInfo { get; set; } 

    // I added this propery so I can round up the binding process in case the properties are simple types 
    public string SomeSimpleProperty { get; set; } 
} 

在這種情況下默認的模型綁定將起作用。 因爲您的操作方法的參數將會是複雜類型UsersIdentificationViewModel,所以帶有反射的DefaultModelBinder類將獲取公共屬性,檢查它們是簡單類型還是複雜類型,然後綁定到它們中的每一個。

如果屬性是複雜類型,則重複該過程。獲取公共屬性集 ,活頁夾嘗試爲它們查找值。屬性名稱是嵌套的。 例如: 設置爲UserName的值,模型聯編程序將查找嵌套數據項UserDetails.UserName

如果屬性是簡單類型,則活頁夾將在請求中查找與該屬性具有相同名稱的數據項。 例如: SomeSimpleProperty屬性將導致活頁夾查找SomeSimpleProperty數據項。 我發現this link對解釋模型綁定非常有幫助。

對於單元測試,如果您選擇案例1或2,則不會有任何問題或差異。