【问题标题】:ASP.NET MVC: How do I handle a view model with many properties?ASP.NET MVC:如何处理具有许多属性的视图模型?
【发布时间】:2010-10-02 16:46:18
【问题描述】:

因此,我的视图与视图模型的比例几乎为 1:1,而且事情似乎进展顺利。如果我正确理解他们的目的,似乎视图模型应该

  1. “精简”实体模型,以便仅将相关属性传递给表示层
  2. 添加演示所需的其他信息,例如创建地址时的州缩写或联系人类型列表。

为了遵守这些原则,我的 Reports 控制器有点碰壁。为客户生成的各种报告需要访问大约 30 个不同的属性。因此,我的视图模型最终看起来与我的实体模型非常相似。

当然,最简单的解决方案是将实体模型传递给视图,这样我就可以访问所有属性,但是我还需要能够为空白或“不完整”的客户生成报告。这会导致在尝试访问我的实体模型上的导航属性时出现引用异常。

所以我可以对视图中的几乎每个字段使用空值检查,这似乎不太吸引人……或者我可以实现一个视图模型来避免空值引用异常。问题是我最终会得到一个看起来像这样的视图模型:

var customer = customersRepository.GetCustomer(id);
var viewModel = new CustomersViewModel()
{
    FirstName = customer.FirstName,
    LastName = customer.LastName,
    Address = customer.MailingAddress.Address,
    City = customer.MailingAddress.City,
    // and on and on for about 30 different properties
};
return View(viewModel);

输入所有这些属性是感觉不对的事情之一。我是否错过了解决此问题的更优雅的解决方案?

【问题讨论】:

    标签: c# asp.net-mvc viewmodel


    【解决方案1】:

    问题是我最终会得到一个看起来像这样的视图模型

    AutoMapper 是必须避免完全编写您发布的代码的必要条件。我还建议您观看 AutoMapper 创建者的精彩 put your controllers on a diet 视频。观看此视频后(以及您的一些努力),您的控制器操作将简化为一个漂亮的线条。

    【讨论】:

    • Automapper 上的 +1,我发现它对于这种领域模型 > 视图模型映射非常宝贵。
    • 谢谢!找到一个完美的拟合解决方案总是很高兴。
    【解决方案2】:

    您绝对应该研究 AutoMapper (http://automapper.codeplex.com/)。

    AutoMapper.Mapper.CreateMap(typeof(CustomersModel), typeof(CustomersViewModel));
    
    AutoMapper.Mapper.CreateMap<CoolObject, CoolObjectViewModel>()
        .ForMember(d => d.Property1, f => f.MapFrom(s => s.Property1))
        .ForMember(d => d.Property2, f => f.MapFrom(s => s.Property2))
        .ForMember(d => d.Property3, f => f.MapFrom(s => s.Property3));
    

    【讨论】:

    • 嗯...如果它早些时候告诉我答案已添加,那肯定会很好。
    【解决方案3】:

    输入所有这些属性是感觉不对的事情之一

    你想达到哪个级别,最终你必须全部输入。

    所以,我认为这种方法同样可以。

    【讨论】:

      【解决方案4】:

      我真的不明白你在这里想要达到的目标.. 编写更多代码并没有错.. 只要代码具体且组织良好,代码的大小无关紧要。您应该担心的是如何减少数据库交互,仅从数据库中检索所需的属性。

      您的代码显示您检索整个客户对象,然后最终显示一些属性,为什么不只检索您需要的属性。

      另外,如果您使用邮件地址的属性,为什么不将整个 mailingaddres 对象作为属性传递,为什么要拆分为其他属性。

      【讨论】:

      • 我关心的是控制器中的所有代码。 Automapper 似乎解决了这个问题。您会建议什么来代替从存储库中获取 Customer 对象?从存储库返回视图模型似乎是错误的,因为域模型应该不知道表示层。
      猜你喜欢
      • 2015-01-28
      • 2013-05-25
      • 2011-01-01
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2018-11-27
      相关资源
      最近更新 更多