【问题标题】:How to use ViewModel in ASPNET MVC3如何在 ASPNET MVC3 中使用 ViewModel
【发布时间】:2020-07-15 08:24:12
【问题描述】:

我正在尝试学习 ASPNET MVC。我已经从 DB 结构开始构建了一个 DbModel,因此,在 Models 下,我有一个可用于访问数据的 .edmx 文件。

我读到让 ViewModels 类在视图和模型之间起作用可能会很好(对于单个字段格式也很有用),但我不明白这是否正确以及以哪种方式更好建造它们。如果他们在我的模型中重现类,我相信这有点多余,不是吗?如果这是正确的方法,有没有办法自动生成 ViewModel 类?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    MVC 中的 ViewModel 是您的视图的模型。它是一个属性包,通常包含原始类型。这似乎是多余的,但您可以通过解耦代码来保护自己免受未来问题的影响。

    例如,给定域模型中的 Person 对象:

    public class Person
    {
        public string FirstName {get; set;}     // John
        public string LastName {get; set;}      // Doe
        public DateTime Birthdate {get; set;}   // 01/01/1965
    }
    

    在您的视图中,您可能希望在视图中将其表示为全名、年龄和生日。您的 ViewModel 将类似于:

    public class PersonViewModel
    {
        public string FullName {get; set;}     // John Doe
        public int Age {get; set;}             // 46
        public int Birthday {get; set;}        // January 1
    }
    

    在您的管道中,您需要从域模型转换为视图模型。我使用了来自持久层的投影查询或对象到对象映射框架,例如AutoMapper

    通过以这种方式构建数据,您可以将逻辑和格式规则排除在视图标记之外。通过使用 AutoMapper 等框架,您还可以标准化日期和时间的字符串格式,并进行基于约定的映射。

    另外,我通常建议每个视图有一个 ViewModel。如果您需要共享 View/ViewModel 结构或应用条件视图信息,则应将它们分成部分视图。

    【讨论】:

    • 您能否提供关于如何处理表单发布场景的建议?.. 我很难从视图模型转换为业务模型.. Automapper,我读过,并不是真的要处理这种情况,处理这种情况的唯一合乎逻辑的方法似乎是在我的业务模型中提供一个构造函数,该构造函数接收一个视图模型实例来构造模型,或者在我的控制器中编写代码(这也似乎很友好奇怪的)..你有什么建议?
    • 在您的控制器中,提供一个带有[HttpPost] 属性的ActionResult,它接受一个具有与您的表单元素匹配的属性的参数对象。 MVC 模型绑定器将使用您的表单元素值填充这些属性。获取该对象并将其传递给您的服务。 (我将这些表单视图模型或简称为表单模型。但它只是一个 DTO,只有您需要更新域模型的部分)
    • 好的,所以在服务中,我会将正确的属性从视图模型设置为业务模型,对吧?有点像这样。
    • 对不起.. 没有及时编辑和添加这张照片......有点像这样?? imgur.com/m9olR我不介意这种方法,从业务映射到 DTO 我使用自动映射器,从 DTO 映射到业务,我必须编写所有这些代码......我将不胜感激你对此的意见......: )
    • 如果你不做任何转换,就没有必要在中间有dto(除非你稍后会更新实现)。如果您需要转换,也可以使用 automapper 进行转换,包括更新现有实体。抽象仍然有意义。
    【解决方案2】:

    如果您刚刚开始,我会避免尝试将您可以找到的所有最佳实践纳入您的早期应用程序。尝试去做每个人都说是最佳实践的事情变得非常容易,而您会忘记学习基础知识。

    视图模型显然是分离表示层和域层的好方法,但它们还有其他用途。如果您刚刚开始并且您的应用程序不是非常复杂,我建议您保持简单并使用您的域类作为您的视图模型,您的视图很简单。这将使您能够更专注于应用程序。

    此外,通过这样做,您会遇到简单域模型无法解决的视图,并且您会发现自己需要一个 ViewModel。这将允许您合并查看页面所需的更具体的信息(例如多个域对象)。

    通过在不使用视图模型的情况下进行练习,您可以了解它们的好处,并确定最适合您和您的代码的方法。

    【讨论】:

      【解决方案3】:

      “视图模型”(视图模型而不是域模型)可帮助您将域模型与绑定到页面的内容分开。总是需要吗?不,但如果您在多个视图上使用一些常见的数据形状,其中视图也将具有一些附加数据,则它很有用。另一个很好的用途是从某些类型的视图中删除某些数据(您的客户不应该知道您的保证金,但您的管理层应该知道吗?)。 IT 不是强制性的。

      【讨论】:

        猜你喜欢
        • 2021-02-13
        • 1970-01-01
        • 1970-01-01
        • 2012-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-31
        • 1970-01-01
        相关资源
        最近更新 更多