【问题标题】:MVC 3 viewmodel propertiesMVC 3 视图模型属性
【发布时间】:2012-10-26 12:08:00
【问题描述】:

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

         }

现在的问题是创建应该具有两个 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; }   

        }

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

【问题讨论】:

  • 您的选项 2 会起作用。支持嵌套视图模型。你试过了吗?
  • 我会试试这个方法,谢谢

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


【解决方案1】:

如果您需要在视图模型中使用 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,则不会有任何问题或差异。

【讨论】:

    猜你喜欢
    • 2012-04-25
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多