ASP.NET MVC术语让我沮丧 - 为什么'ViewModel'?

JBR*_*son 7 asp.net-mvc viewmodel

我是一个ASP.NET MVC新手,但以前使用过很多模型 - 视图 - 控制器框架.

最近遇到了这样的惯例,即将您的特定视图所需的数据(实际上,它被分配给ViewData)收集到一个名为(NameOfView)ViewModel的新类中.

收集这些数据,使其与View/Controller交互提供的功能相关联,这使我成为一个辅助结构,甚至是闭包机制(在'封装一组变量'意义上).

那么为什么它被称为'ViewModel',因为它既不是视图也不是模型?

有没有其他人觉得这个名字令人困惑?

编辑:只是将属性放到View上有什么问题,以便Controller可以填充它们(如在其他MVC框架中)?

ahs*_*ele 11

在我对这个主题的阅读中,我遇到了各种各样的争论,即开发人员为什么要或不想使用ViewModel.有些人甚至认为ViewModel永远不应该暴露除字符串之外的任何东西.在这一点上,我的想法并不是那么极端.但是,我同意,将域/核心对象暴露给视图并不是一个好主意.经过一些亲身体验后,删除这种依赖感觉更干净.

虽然我不同意以下所有内容,但Daniel Root ViewModel提供了一个相当不错的案例:

大多数MVC示例直接使用模型类,例如LINQ-to-SQL或Entity Framework类.MVC的Visual Studio连接甚至引导您进入这个概念,它具有默认的"添加视图"代码生成功能,可以让您根据单个模型类快速生成视图.但是,在真实世界的应用程序中,您通常需要的不仅仅是单个表格的数据来构建页面.一些示例通过将辅助数据填充到ViewData中来解决这个问题,但更好的方法是创建一个"汇总"类来包含 视图所需的所有内容的属性.这具有更强大的类型,支持intellisense,可测试以及确切地定义视图需要的额外好处.

Jeff Handley给出了一个很好的描述ViewModel模式,他认为它可以与MVC结合使用.

编辑
我最近把我的想法与Jimmy Bogard关于视图模型的想法一致.在每次实现后都有相当多的痛苦之后,我尝试过每个视图都有一个视图模型,这样可以创建更清晰的开发体验.


Sho*_*og9 10

该模型是数据的视图不可知表示.该视图模型是数据的视图,具体表示:它的模型,因为它可能会从给定的显示视图点.

考虑一个由原始数据点组成的模型; 然后,直方图视图可能具有视图模型,该视图模型由一组桶和从该数据中提取的总计组成.

从逻辑上讲,它是模型的子集或转换 - 它可以使用视图特定功能按需生成,模型作为其唯一输入.

关于视图与属性包或自定义对象的属性......我确信有人对此有强烈的感受,但我个人并不认为有很大的区别.您正在生成模型的视图特定表示并以某种方式传递它; 确切的机制似乎并不那么重要.

  • 术语视图模型似乎相当新,但创建特定于视图的模型的概念却不是. (3认同)
  • 我不相信有任何关于它的ASP.NET特定内容......但Google搜索引入了很多WPF引用.这是一种模式; 你可以想象它可以与任何东西一起使用. (2认同)