asp.net mvc - 几乎相同的 ViewModel

asp.net mvc - nearly identical ViewModels

我正在使用 ASP.NET MVC 构建 Web 应用程序,但我仍然是这项技术的初学者。

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

我有一个名为 Rule 的模型。 它包含 Id、标题、描述、LastModifiedDate、CreatedDate 等字段。

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

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

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

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

is/was 从来没有为每个视图创建 ViewModel 的规则。这完全取决于您的架构。根据您的要求,如果您觉得两个视图完全相同,则使用相同的 ViewModel。

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

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

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

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

每个视图的不同 ViewModel

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

为不同的视图重复使用 ViewModels

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

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

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

您的业务对象可以具有 CRUD 方法。您的视图模型可以有一个 属性 来公开您的对象,并且实际上可以根据需要公开其他对象。

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

但是,这确实是一种设计选择,而不是 "best practice"(老实说)随风而变。