MVC 3视图模型属性

时间:2012-11-06 14:06:41

标签: c# asp.net-mvc-3 viewmodel asp.net-mvc-viewmodel

我对viewModel中的属性组织有疑问。据我所知,viewmodel应该尽可能简单,它应该做的主要是绑定数据来查看。

问题是如何区分viewmodel中的属性和BL模型。 我的意思是,例如我有一个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;}
            ...

         }

现在的问题是创建ViewModel的最佳实践是什么,它应该包含两个BL模型的数据。

1)复制2个模型的属性,并使用默认模型绑定将数据从视图传输到控制器,然后从ViewModels创建BL模型并通过存储库更新数据?在这种情况下,我们有代码重复......

2)ViewModel应该类似于:

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

            public UserInfoModel UsersInfo { get; set; }

            public UserDetailsModel UserDetails { get; set; }   

        }

默认绑定在这种情况下不起作用(如果我误会,请纠正我)我应该编写自定义模型绑定器或类似的东西......什么方法更适合单元测试,或者可能有另一种方法?< / p>

1 个答案:

答案 0 :(得分: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; }
}

默认模型绑定在这种情况下有效。 因为action方法的参数将是复杂类型UsersIdentificationViewModel,所以带有反射的DefaultModelBinder类将获取公共属性,检查它们是简单类型还是复杂类型然后绑定到它们中的每一个。

如果属性是复杂类型,则重复该过程。这套 获取公共属性,并且活页夹尝试为它们查找值。属性名称是嵌套的。 例如: 要设置UserName的值,模型绑定器将查找嵌套数据项UserDetails.UserName

如果属性是简单类型,则绑定器将在请求中查找与该属性同名的数据项。 例如: SomeSimpleProperty属性将使绑定器查找SomeSimpleProperty数据项。 我发现this link非常有助于解释模型绑定。

对于单元测试,如果您选择案例1或2,则不会有任何问题或差异。