ViewModels和渲染

时间:2010-01-02 09:43:38

标签: asp.net-mvc separation-of-concerns mvvm

在几个示例项目中,我看到ViewModels用于将数据对象转换为字符串,以便在View中使用。

ViewModel通常会有一个构造函数,它接收一个参数 - 一个数据对象。然后构造函数将填充ViewModel的各种属性(主要是字符串和整数)。

这可以防止在视图中出现任何复杂的逻辑。

乍一看,这对我来说似乎是一个好主意,因为它更全面地强化了View与复杂逻辑的分离。

例如,假设我的视图试图渲染数据对象的属性“大小”,大小为1到3之间的数字,表示“小/中/大”。

在我的视图中没有if / switch语句,我在ViewModel中只有一个'SizeString'或类似的东西,而if / switch语句将在ViewModel构造函数中。

有人不同意这种做法吗?

使用其他方法(如助手)会更好吗?如果是这样,为什么?

2 个答案:

答案 0 :(得分:6)

ViewModel的目的是表示复杂的域模型(的一部分),该模型被分解为可以以其他形式呈现的基元。

这种分解必须在某个地方进行。它可能涉及一些简单的逻辑,例如我最喜欢的例子:将离散值( OK 警告错误)转换为颜色(绿色,黄色,红色)。这是ViewModel所做的事情的本质,因此我的默认方法是将此逻辑封装到ViewModel本身。

考虑替代方案:如果未在ViewModel中实现,那么在哪里?如果你将逻辑放在其他地方,你最终会得到一个ViewModel,它基本上只是一个没有逻辑的结构。让ViewModel封装域对象的转换/分解非常适合Single Responsibility Principle

虽然这是我的默认方法,但我总是意识到逻辑可能需要在多个ViewModel中重用。在这种情况下,这可能表明原始ViewModel实际上是由多个子视图组成的复杂ViewModel。在这种情况下,您可以将公共逻辑提取到仅包含该小部分的子ViewModel中。

答案 1 :(得分:2)

它将所有内容转换为字符串,因为web中的所有内容都是字符串。

基本上 - 视图模型应该处于“准备输出”状态。如果网页仅由数字组成 - 我们会将所有内容转换为整数/小数。

整个观点模型 - 格式化数据可表示。在你的情况下 - 大小枚举到小/中/大。这并不意味着从视图中分离逻辑会使这一点变得有价值 - 它能够以一种方式在一个地方熟练掌握您的数据。


回答评论=>

是的,这很好。我也是这样做的。但值得一提的是 - 我并不反对将其纳入观点。因为视图和视图模型是'依赖链'中的最后一个。我非常务实,完全反对开发人员使用域模型作为视图模型并且视图模型的要求与域模型冲突的情况(即,当开发人员添加新的“域对象”仅用于表示目的时)。

相关问题