我对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>
答案 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,则不会有任何问题或差异。