我正在使用ASP.NET MVC构建一个Web应用程序,我仍然是这项技术的初学者。
我了解到最佳做法是为每个View配备一个ViewModel。我能理解为什么这是一个好主意。然而,在我的情况下,它似乎创造了许多额外的工作。
我有一个名为Rule的模型。 它包含Id,Title,Description,LastModifiedDate,CreatedDate以及其他字段。
我有规则模型的编辑,创建和详细信息视图。
根据最佳实践,我必须为上述每个视图创建一个ViewModel。但上面视图的ViewModel几乎完全相同。唯一的区别之一是Create-ViewModel没有Id,但是Details和Edit ViewModel没有。除此之外,ViewModel几乎完全相同。也就是说,它们包含相同的属性和相同的DataAnnotation验证字段。
为什么我认为这很麻烦?假设我想要更改一些数据注释。例如。 chaneg a string属性的最大长度。如果我希望这样做,我必须在Rule模型,Create ViewModel和Edit ViewModel中这样做。同样,如果我想添加新属性,我必须在所有模型中这样做。
我这样做是对,还是可以简化?
答案 0 :(得分:3)
这更像是一个实施决策而不是最佳实践规则。你必须考虑一些利弊:
每个视图的不同ViewModel
重复使用ViewModel以获取不同的观看次数
我的建议是创建没有ID属性的基本RuleViewModel,并且编辑和详细信息操作会继承模型并添加其他列。
答案 1 :(得分:2)
从来没有规则为每个View创建ViewModel。这完全取决于您的架构。根据您的要求,如果您认为两个视图完全相同,则使用相同的ViewModel。
IMO不使用数据注释,如果可能,请使用Fluent Api。
答案 2 :(得分:0)
对于所有操作:添加,更新,删除 - 您可以使用一个视图模型 - Rule
。你完全可以使用这个单个对象进行操作,对吗?
唯一的区别是显示多个Rule
对象 - 列表视图页面,在这里你可能想要创建一个额外的视图模型,如RuleListViewModel
,它将包含一个集合(IEnumerable<Rule>
)对象和可能还有一些用于过滤的属性等。
答案 3 :(得分:0)
听起来您正在混合视图模型和业务对象。我通常会尝试将它们分开,因为它们用于不同的目的。
您的业务对象可以使用CRUD方法。您的视图模型可以具有公开对象的属性,并且实际上可以在需要时公开其他对象。
这样做可以保留一次性使用规则并使其非常易于维护。
但是,这实际上是一种设计选择,而不是“最佳实践”(让我们诚实地说)随风而变。