1

我对 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;}
            ...

         }

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

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

2) ViewModel 应该类似于:

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

            public UserInfoModel UsersInfo { get; set; }

            public UserDetailsModel UserDetails { get; set; }   

        }

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

4

1 回答 1

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数据项。我发现这个链接对解释模型绑定很有帮助。

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

于 2013-02-28T15:18:14.877 回答