【问题标题】:ASP.NET MVC Model vs ViewModelASP.NET MVC 模型与 ViewModel
【发布时间】:2011-05-02 23:09:12
【问题描述】:

好的,我一直在听关于 MS 的 ASP.NET MVC 的“ViewModels”的讨论。

现在,这是一种特定的模型,对吗?不是特定类型的视图。

据我了解,它是一种具有与视图交互的特定目的的模型?或者类似的东西?

我们将不胜感激。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2 model viewmodel


    【解决方案1】:

    WikiPedia 对 Model 与 ModelView 的描述比您在 SO 答案中得到的更完整:http://en.wikipedia.org/wiki/Model_View_ViewModel

    我引用:

    模型:在经典 MVC 模式中,模型指的是 (a) 表示真实状态内容的对象模型(面向对象的方法),或 (b) 数据表示该内容的访问层(以数据为中心的方法)。

    视图:与经典的 MVC 模式一样,视图指的是 GUI 显示的所有元素,例如按钮、窗口、图形和其他控件。

    ViewModel:ViewModel 是“View 的模型”,这意味着它是 View 的抽象,也用于 View 和 Model 之间的数据绑定。它可以被看作是控制器(在 MVC 模式中)的一个特殊方面,它充当数据绑定器/转换器,将模型信息更改为视图信息并将命令从视图传递到模型。 ViewModel 公开了公共属性、命令和抽象。 ViewModel 被比作数据的概念状态,而不是模型中数据的真实状态。

    【讨论】:

    • 虽然有 Model 和 ViewModel 的描述,但该链接只是描述 MVVM 架构模式。不是模型和视图模型之间的区别
    【解决方案2】:

    用最简单的术语来说,我喜欢考虑以下几点:

    模型:在外观和感觉上都像您的数据模型。出于所有意图和目的,它只是数据模型的类表示。它不知道您的视图或视图中的任何元素。也就是说,它不应包含您将用于视图的任何属性装饰器(即:必需、长度等)。

    视图模型:充当视图和模型之间的数据绑定器,在许多情况下,它也是模型的包装器。如果没有 View,它将变得无用,因此它通常不能像标准模型那样跨多个 View 和 Controller 重用。

    例如,您的模型可能具有以下属性,这些属性是您的数据源的直接表示:

        public string FirstName { get; set; }
        public string LastName { get; set; }
    

    现在,由于您的 View Model 与您的 View 绑定,它可能具有以下属性 - 将 Model 的 FirstName 字段和 LastName 字段连接在一起作为一个字符串:

        [Display(Name = "Customer Name")]                
        public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}
    

    【讨论】:

    • 您能否提供一个更完整的 ViewModel 示例?它如何知道 myModel 是什么以及如何获取 myModel 的数据?
    • 从本质上讲,ViewModel 是一个普通的 C# 对象 (POCO),永远不会真正知道您的数据模型是什么样的。它更像是数据模型和视图需要显示的特定元素的混合体。至于它如何获取数据,你必须用数据加载它。我喜欢使用一个单独的中间类,我在其中调用我的数据服务,然后手动将该数据加载到我的 ViewModel 中。然后我将完全加载的 ViewModel 返回到控制器操作。
    【解决方案3】:

    我发现这篇文章是了解“域模型”和“视图模型”如何在 MVC 应用程序中交互的非常有用的资源,尤其是在绑定方面。最重要的是包括示例而不是抽象描述。

    “自从 MVC 发布以来,我发现很多关于如何最好地构建视图模型的困惑。有时这种困惑并非没有充分的理由,因为似乎没有大量关于最佳实践建议的信息. 此外,没有“一刀切”的解决方案可以作为灵丹妙药。在这篇文章中,我将描述一些已经出现的主要模式以及每种模式的优缺点。重要的是请注意,其中许多模式都是从人们解决现实世界问题中出现的。”

    http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

    【讨论】:

      【解决方案4】:

      有一个 ViewModel 的概念,但它通常不与 Asp.net MVC 相关联。 MVC 使用模型视图控制器模式,其中控制器处理交互,从模型构建数据,然后将该数据传递给视图进行显示。

      ViewModels(和 Model View ViewModel 模式)更普遍地与 Silverlight 和 WPF 相关联。 Xaml 有点不同,因为视图可以双向绑定到 ViewModel,所以技术有点不同。例如,如果您将一个文本框绑定到一个字段,当您在该文本框中键入时,该字段的值会动态更新。由于网页是无状态的,因此这种交互在网页中实际上是不可能的。

      这两种模式的相似之处在于它们都试图将逻辑与显示分开。最常见的用途/原因是测试:您希望能够从代码(通过测试框架)执行用户将通过用户界面调用的所有交互。

      【讨论】:

      • 在我正在阅读的“专业 ASP MVC 2”一书中,第 1 章介绍了 ViewModel,作为保持演示/模型交互强类型和 DRY 的一种手段。微软的作者包括 Scott Hansleman、Phil Haack、Scott Guthrie。
      • 我最近看到了很多,ViewModel 被用在 Asp.net MVC 中。看起来 ViewModel 在视图中比领域模型有更多的业务。所以我们一直使用的模式是让领域模型组装 ViewModel 的主要部分。目前,我们使用修改后的命令模式(操作)与域模型一起执行任务。结果被组装到 ViewModel 中并发送到视图。在这种情况下,视图模型包含支持视图的所有注释和简单、集中的逻辑。
      【解决方案5】:

      本质上 Model 和 View Model 都是具有属性的简单类。

      这些类的主要目标是为它们各自的受众(分别是控制器和视图)描述(“模型”)一个对象。

      所以你说的完全正确

      据我了解,这是一种 具有特定目的的模型 与视图交互

      因此,虽然模型类是您的应用程序与之交互的有效领域实体,但视图模型是您的视图与之交互的简单类。

      希望对你有帮助:)

      更新

      Microsoft 开发了 Martin fowler 的 Presentation Pattern 的专门版本,主要基于 Model-View-Controller,并将其称为 PF 应用程序的 Model-View-ViewModel (MVVM)。此模式针对现代 UI 开发平台,在这些平台上,与传统开发人员相比,UI 开发人员更多地基于业务逻辑有不同的需求。看看here 了解一些理论

      【讨论】:

      • 好的,谢谢,也谢谢你的更新,这很有帮助!那么,在不考虑 MS 的特殊版本的情况下,使用股票 MVC 2,您是否将 ViewModels 放在一个特殊的指定文件夹中?或者它们本质上只是像其他任何东西一样直接放入模型文件夹中。或者,你能做到吗?
      • 不客气。通常我将模型和视图模型放在同一个文件夹中,因为我想根据它们所引用的域将它们组合在一起,但这只是我的选择,我相信会有更好的
      • ViewModel 应该将 View 与(域)Model 分开。因此,将 ViewModel 放在 View 附近而不是 Model 附近是有意义的。
      • 我会将我的“模型”类保留在我的 MVC 项目之外,而不是在模型文件夹中 - 但是,我会将视图模型类保留在 MVC 项目中,这样,正如 Vitaliy 所说的那样靠近景观。
      • @Lorenzo 在您的第一行中,您说“两个具有属性的简单类”。我想你的意思是属性?如果不是,您指的是哪些属性? AttributesProperties
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 2011-01-19
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多