2012-11-06 151 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,则不会有任何问题或差异。