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"(老实说)随风而变。
我正在使用 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"(老实说)随风而变。