我应该在不同的视图中重用视图模型吗?

Roo*_*ian 13 c# asp.net-mvc viewmodel

我注意到我的观点需要与其他人一样的信息.但有时您需要视图模型的5个属性,有时只需要2个属性.

您是在多个视图上共享此类视图模型还是为每个视图创建单独的视图模型,或者您是否优先选择继承合成策略?

对我来说,共享视图模型有一些缺点:

  1. 最少惊喜的原则:只填充视图模型中的5个属性并获取空引用异常是很奇怪的,因为您不想查询数据库的其他数据.当视图模型有5个属性时,我希望所有属性都被填充.例外证明了这一规则.
  2. 关注点分离/单一责任原则:视图模型在复杂站点上混乱,因为您必须满足每个视图的不同需求.如果涉及逻辑,它也会变得更加复杂.

你怎么看?你是如何处理这种情况的?

Jac*_*itt 9

人们倾向于根据他们使用的观点而拥有不同的ViewModels理念.ViewModels是视图和模型之间的粘合剂,人们通常会根据他们喜欢的两端更加严格来确定答案.

  • 如果您希望模型/数据对象更加严格,那么您将倾向于将ViewModel与模型/数据联系起来 - 即,您将拥有在多个视图中使用的单个ViewModel,并让ViewModel确定哪些属性根据您希望如何处理数据加载(并推迟图像或其他长载属性等)来检索.
  • 如果您希望您的视图更加严格,那么您将ViewModel更接近View - 即为每个视图设置一个单独的ViewModel,并让模型/数据对象在从视图移动到视图时处理同步等事务.

就个人而言,我更喜欢第一个,因为我的数据往往更加严格,因为它不像视图那样改变(在我的项目中 - 我认为这不是数据和视图的通用属性).由于更改通知是ViewModel的一个自然特性,因此如果用户碰巧有两个显示相同/相似数据的视图,则不必让我的模型对象进行通信更改.


Jak*_*eta 7

在我正在处理的项目中,每个视图都有自己的ViewModel,但是我们也有CollectionViewModels,它们由多个视图模型共享/引用.

思考 - 供应商列表,需要在您的应用程序的多个屏幕中显示 - 并且绑定到各种控件 - 列表框,网格视图,无论您需要什么.只有一个ViewModel可以简化供应商列表的更新/刷新逻辑.

TLDR:如果所有用例都以相同的方式使用ViewModel,我只会重用视图模型.即它们都使用相同的属性等.