【问题标题】:MVC viewmodel redundancyMVC 视图模型冗余
【发布时间】:2013-03-09 15:54:18
【问题描述】:

创建 ViewModel 不会导致冗余吗?从某种意义上说,我有我的域模型,我需要在视图上显示来自它的数据。所以我们创建 ViewModels,添加 DataAnnotations 并将其显示在 View 上。此时我有 2 个具有几乎相同数据的对象。

【问题讨论】:

    标签: asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-viewmodel


    【解决方案1】:

    正如其他人已经说过的,只有最简单的应用程序才能将其域模型直接传递给视图。即便如此,由于很多原因,这仍然不是一个好主意。

    视图的要求与数据模型的要求不同。例如,您可能有一个字段在您的视图中是必需的,但在您的 vie 模型中可以为空。如果您添加一个“[Required]”属性,那么您的模型现在将认为该字段不可为空。

    但是,我从不在视图中使用域模型的最大原因是为了安全。 MVC 允许您向其发布任何值,并且默认模型绑定器会愉快地将您发布的值插入模型中,这意味着如果您有一个 IsAdmin 标志,并且有人为 IsAdmin 发布了一个真实值,那么当您将更改保存到模型,现在有人是管理员。

    网络安全的第一条规则是永远不要信任来自用户的输入,并且将视图模型直接传递给视图基本上放弃了对数据的清理。

    【讨论】:

    • 感谢您的回复。填充 ViewModel 的最佳实践是什么(我知道我们可以使用 Automapper)。我想知道是否有更好的方法来加载 ViewModel,而不是让控制器代码混乱
    • @itsbpk - 我倾向于使用 AutoMapper,尽管创建简单的映射器方法也非常容易。您可以将这些实现为扩展方法,只需说 model.Map(otherModel)。无论哪种方式,它都不会弄乱你的控制器。
    【解决方案2】:

    是的,这是一种冗余形式。但通常需要冗余来实现其他目标。在模型的情况下,视图模型和域模型的这种分离有助于实现视图和数据存储之间的解耦设置。而且 ViewModel 并不经常是 Domain 的精确副本。

    这意味着,任何一个都可以改变而不会影响另一个。我可以看到这很有价值的情况 - 表中的数据类型更改不需要部署 Web 应用程序。

    因此,总而言之,虽然存在冗余,但系统是否足够复杂以从这种冗余中受益是一个设计选择。

    【讨论】:

      【解决方案3】:

      在 99% 的情况下,ViewModel 不会导致冗余。

      我想到的唯一 1% 是带有贫乏领域模型和页面的简单应用程序,它只在页面上显示单个模型。这是内容管理页面特有的。

      在任何其他情况下:
      1) 您的 ViewModel 将加入来自多个域模型的信息
      2) 您将在域模型中拥有特定于您的域的逻辑
      3) 将 DataAnnotations 等特定于视图的元信息混合到您的域中并不是一个好主意

      【讨论】:

        【解决方案4】:

        不,使用 ViewModel 有它自己的目的。让我们考虑一下当您的视图有两个或更多来自域模型的实体时,如果没有 ViewModel,您将如何组织数据?有时视图所需的数据与域模型不完全一样,它可以具有 更少或更多信息,有时我们必须在渲染视图之前预处理来自域的数据(例如,格式化日期时间取决于客户的文化)。

        此外,ViewModel 有助于将 Web UI 与域层分离。领域模型中的实体不仅仅是数据表示(这是视图模型的唯一目的),它们还具有模仿业务规则的操作,您不希望将太多领域知识暴露给不需要的 UI 层知道。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多