【问题标题】:ASP.NET MVC terminology is tripping me up - why 'ViewModel'?ASP.NET MVC 术语让我大吃一惊——为什么是“ViewModel”?
【发布时间】:2011-01-06 22:45:26
【问题描述】:

我是 ASP.NET MVC 新手,但之前使用过很多 Model-View-Controller 框架。

recently came across 将您的特定视图需要的数据片段(实际上,它分配给 ViewData)收集到一个名为 (NameOfView)ViewModel。

收集这些数据以使其与视图/控制器交互提供的函数相关联,这让我觉得这是一个辅助结构,甚至是闭包机制(在“封装变量集合”的意义上)。

既然它既不是视图也不是模型,为什么还要叫它“ViewModel”呢?

有没有人觉得这个名字很混乱?

编辑:仅仅将属性放到视图上以便控制器可以填充它们有什么问题(就像在其他 MVC 框架中一样)?

【问题讨论】:

  • +1 这样你的代表就不再是野兽的数量了

标签: asp.net-mvc viewmodel


【解决方案1】:

模型是数据的视图不可知表示。 view 模型是数据的特定视图表示:它是 model,因为它可能从给定的 view 点出现。

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

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

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

【讨论】:

  • “从逻辑上讲,它是模型的子集或转换”或多个模型的合并
  • 这是一个 ASP.NET MVC 约定还是整个行业的约定?
  • 我不相信有任何关于它的 ASP.NET 特定的东西......虽然谷歌搜索出现了很多 WPF 引用。这是一种模式;你可以想象它与任何东西一起使用。
  • 术语视图模型似乎很新,但创建特定于视图的模型的概念却不是。
  • 另一种看待它的方式,“视图模型”是由视图驱动的概念立场,与“模型”相反,它是由数据层驱动的真实状态立场。或许“模型”一词应该重新命名为“数据模型”。
【解决方案2】:

在阅读该主题时,我遇到了各种关于开发人员为什么会或不想使用 ViewModel 的论据。有些人甚至争辩说ViewModel should never expose anything more than strings。在这一点上,我的想法并没有那么极端。但是,我同意将域/核心对象暴露给视图不是一个好主意。在一些第一手经验之后,消除这种依赖感觉会更干净。

虽然我不同意 Daniel Root 以下的所有内容,但 a pretty good case for a ViewModel

大多数 MVC 示例直接使用 模型类,例如 LINQ-to-SQL 或实体框架类。视觉 MVC 的工作室布线甚至可以引导您 用它的默认值进入这个概念 “添加视图”代码生成,它可以让 您可以根据 单一模型类。然而,在 您经常需要更多的真实应用程序 不仅仅是一个表的数据 建立一个页面。一些例子得到 通过填充辅助数据来解决这个问题 进入 ViewData,但更好的方法 这是创建一个“汇总”类 包含一切的属性 你的观点将需要。这有 更多的额外好处 强类型,支持 智能感知,可测试,并且 准确定义视图需要什么。

Jeff Handley 很好地描述了ViewModel pattern,他认为它可以与 MVC 结合使用。

编辑
我最近将我的想法与Jimmy Bogard's 关于视图模型的想法保持一致。在每次实现都经历了相当多的痛苦之后,我尝试了having one view model per view creates 一个更干净的开发体验。

【讨论】:

    【解决方案3】:

    之所以这样称呼,是因为它是“为视图制作的模型”。我明白为什么术语的选择有点令人困惑。

    如果您不希望将所有数据作为大哈希数组传递给视图,这是一种有用的方法。它为您提供了一个专用于 UI 的强类型类,它既不会污染核心模型,也不会污染视图。它还允许你封装 UI 逻辑——视图应该是kept dumb

    【讨论】:

    • '视图应该保持沉默' - 当然,这就是我们有控制器的原因。引用的文章使用了“if (ViewModel.MeaningfulFlag) { do this } else {do that};”等结构在视图中避免“将业务逻辑放在视图中”。这比控制器在实际视图上设置等效属性“更好”如何?
    【解决方案4】:

    Re:为什么控制器不能在视图上填充属性?

    因为在控制器操作执行时视图不存在。从您的操作返回 ActionResult 背后的想法是,处理管道中稍后会评估结果并确定最佳操作过程(可能呈现视图,或者可能选择与请求匹配的视图(例如为移动设备制作的特殊视图)设备))。

    我在这里发表了一篇关于选择正确模型对象的帖子:将 M 放入 MVC Part IPart IIPart III

    是的,“ViewModel”这个词现在很流行,但它是最初的 MVC 采用者所想的精神。

    【讨论】:

      【解决方案5】:

      这实际上不是一个答案,但我强烈建议您观看 Scott Hanselman 的 MVC2 Basics 视频。它解释了一切,尽管我已经完成了 ASP.NET MVC,但它让我明白了很多事情。

      在这里:http://channel9.msdn.com/Blogs/matthijs/ASPNET-MVC-2-Basics-Introduction-by-Scott-Hanselman

      【讨论】:

        猜你喜欢
        • 2014-07-20
        • 1970-01-01
        • 1970-01-01
        • 2016-07-08
        • 2015-05-29
        • 2019-03-05
        • 1970-01-01
        • 1970-01-01
        • 2011-03-30
        相关资源
        最近更新 更多