【问题标题】:Scope of viewmodels in asp.net MVC 3asp.net MVC 3中视图模型的范围
【发布时间】:2012-04-25 14:07:39
【问题描述】:

我有 read online 说使用“厨房水槽”模型是不好的做法:

规则 #3 – 视图决定了 ViewModel 的设计。只有什么是 渲染视图所需的视图通过 ViewModel 传递。

如果客户对象有五十个属性,但只有一个组件 显示他们的名字,然后我们创建一个自定义 ViewModel 类型,只有 这两个属性。

不过,Jimmy Bogard 随后对这有多好的解释让我有些疑惑。让我的模型只包含客户列表非常容易,我什至可以使用我的 POCO。

那么现在我要为网站上的每个页面创建自定义小视图模型片段了吗?每个使用 Customer 属性的页面都会得到一个,但当然不能共享,因为某些信息是无关的,例如,如果一个页面使用 Age 而不是 Name。两个新的迷你视图模型类对吗?

这非常耗时,并且似乎会导致一百万个小自定义视图模型 - 有人可以详细说明这种方法的实用性以及为什么更简单的方法不好?

【问题讨论】:

  • 我同意你的看法。视图模型非常适合组合各种 POCO。但是削减你已经构建的 POCO 只是为了实现 1:1 的 ViewModel 与 View 的比率对我来说似乎也是不必要的步骤。

标签: asp.net-mvc model-view-controller


【解决方案1】:

视图模型类不仅可以用来传递值,它还定义了数据类型(数据注释)、验证规则和与模型中使用的不同的关系。我现在想到的一些优点:

  • 更改用户密码时有不同的验证规则, 更改他的基本数据或订阅设置。有可能 在一个模型类中定义所有这些规则很复杂。它看起来 使用不同的视图模型时效果更好、更简洁。
  • 使用视图模型还可以为您带来性能优势。如果你 想要显示用户列表,你可以用 id 和 name 定义视图模型 only 并使用索引从数据库中检索它。如果你找回 整个对象并将其传递给查看,您可以从中传输更多数据 比你需要的数据库。
  • 您可以为视图模型定义显示和编辑器模板,并使用 html 帮助器在不同的页面上重复使用它们。当您为模型 POCO 定义模板时,它看起来更糟。

【讨论】:

  • 感谢您的回复 - 但我可以向部分 POCO 类添加属性和数据注释吗?
  • @sweaver2112:可以,但可能会导致与在两个不同视图中使用的类相关的问题。将模型层和视图层分开是通用的 MVC 规则,但我可以说,在简单的项目中使用 POCO 并不是犯罪。另一方面,如果你养成了创建视图模型的习惯,你可能会发现它更容易:)
【解决方案2】:

如果您将 POCO 对象用作视图模型,那么您实际上会显示您的私有对象并破坏封装。这反过来又会使您的模型很难在不更改相应视图的情况下进行更改。

您的数据对象可能包含仅适用于数据访问层的详细信息。如果您将这些内容暴露给视图,那么有人可能会更改您没想到会更改的那些值并导致错误。

与在 OO 语言中拥有私有成员的许多相同原因都适用于这种推理。话虽如此,它仍然经常被破坏,因为创建所有这些“一次性”模型需要大量额外的工作,而这些模型只能使用一次。存在用于创建此类模型的框架,尽管我不知道名称,它可以将对象联系在一起并挑选出有趣的属性,从而消除创建特定视图模型的一些苦差事。

【讨论】:

    【解决方案3】:

    您的视图模型告诉视图应如何显示数据。它表达了模型。我认为没有必要拥有两个视图模型,除非你有两种方法来表达你的模型。仅仅因为你有两个页面,并不意味着你将以任何不同的方式显示数据,所以当它可以在一个可重用的视图模型中时,我不会浪费时间制作两个迷你视图模型,想象一下如果以后你有一个页面需要姓名和年龄,你会创建另一个视图模型吗?这绝对是愚蠢的。但是,如果您有两个页面都显示“年龄”并且需要以不同的方式显示,那么我会创建另一个页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-24
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      相关资源
      最近更新 更多