【问题标题】:asp.net mvc - nearly identical ViewModels [duplicate]asp.net mvc - 几乎相同的 ViewModel [重复]
【发布时间】:2017-06-01 18:07:56
【问题描述】:

我正在使用 ASP.NET MVC 构建一个 Web 应用程序,并且还是这项技术的初学者。

我了解到,为每个视图设置一个 ViewModel 是最佳实践。我可以理解为什么这是一个好主意。然而,在我的情况下,它似乎创造了很多额外的工作。

我有一个名为 Rule 的模型。 它包含 Id、Title、Description、LastModifiedDate、CreatedDate 等字段。

我有一个规则模型的编辑、创建和详细信息视图。

根据最佳实践,我必须为上述每个 View 制作一个 ViewModel。但上述视图的视图模型几乎相同。唯一的区别之一是 Create-ViewModel 没有 Id,但 Details 和 Edit ViewModel 有。除此之外,ViewModel 几乎相同。也就是说,它们包含相同的属性和相同的 DataAnnotation 验证字段。

为什么我觉得这很麻烦?假设我想更改一些数据注释。例如。更改字符串属性的最大长度。如果我想这样做,我必须在规则模型、创建视图模型和编辑视图模型中都这样做。同样,如果我想添加新属性,我必须在所有模型中都这样做。

我这样做对吗,还是可以简化?

【问题讨论】:

  • 您可以使用相同的视图模型进行创建、查看和编辑。
  • 为每个视图设置一个 ViewModel 的最佳实践不,不是。这很有帮助,但您没有必须这样做。如果它保证了一个视图模型,那就做一个,那也很好
  • 您可以使用类继承来减少代码重复。如果您对所有视图使用相同的模型,请注意过度发布。
  • 正如其他人所说,您没有必须这样做。留着DRY

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


【解决方案1】:

嗯,这更像是一个实施决策,而不是最佳实践规则。您必须考虑一些利弊:

每个视图都有不同的 ViewModel

  • 仅修改与视图关联的 ViewModel
  • 灵活性
  • 大型应用程序难以维护

为不同的视图重用 ViewModel

  • 一次修改所有 ViewModel
  • 更容易维护
  • 灵活性有限

我的建议是创建没有 ID 属性的基本 RuleViewModel,并为编辑和详细信息操作继承模型并添加附加列。

【讨论】:

    【解决方案2】:

    按视图制作 ViewModel 是/从来不是规则。这完全取决于您的架构如何。根据您的要求,如果您觉得两个视图完全相同,请使用相同的 ViewModel。

    IMO 不使用数据注释,如果可能,请使用 Fluent Api。

    【讨论】:

      【解决方案3】:

      对于所有操作:添加、更新、删除 - 您可以使用一个视图模型 - Rule。你想用这个单一的对象来操作完全没问题,对吧?

      唯一的区别是显示多个 Rule 对象 - 列表视图页面,在这里您可能想要创建一个额外的视图模型,如 RuleListViewModel 它将包含对象的集合 (IEnumerable<Rule>),也许还有更多过滤等属性。

      【讨论】:

        【解决方案4】:

        听起来您正在混合视图模型和业务对象。我通常会尝试将它们分开,因为它们有不同的用途。

        您的业务对象可以有 CRUD 方法。你的视图模型可以有一个属性来暴露你的对象,如果需要的话,实际上可以暴露其他对象。

        这样做可以保留一次性使用规则并使其非常易于维护。

        但是,这确实是一种设计选择,而不是(说实话)随风而变的“最佳实践”。

        【讨论】:

          猜你喜欢
          • 2023-03-27
          • 2018-09-07
          • 2019-02-13
          • 1970-01-01
          • 2020-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多