【问题标题】:Should I use a view model for just two objects?我应该只对两个对象使用视图模型吗?
【发布时间】:2012-01-04 12:13:43
【问题描述】:

假设我有一个接受 Person 对象的视图。

拥有三个属性,FirstNameLastNameAge

现在假设我添加了另一个不属于对象的文本框字段。

我不需要文本框的值,它只是填充了供用户使用的数据。

当您编辑字段并将Person 发布到控制器时,假设存在验证问题,因此您返回带有错误的 Person 对象

现在的问题是额外的文本框已经失去了它的价值,因为它不是模型的一部分。

所以我创建了一个 ViewModel,其中包含该字段的字符串属性和 Person 属性以保留所有值。似乎有更好的方法将值保留在“特殊”文本框中?

【问题讨论】:

    标签: asp.net-mvc model-binding


    【解决方案1】:

    您应该能够从发布的字段中获取该额外字段。第一次如何通过 ViewBag 设置它?您应该可以重新设置它。

    但是使用 ViewModel 到底有什么问题呢?迟早您将有 2 或 3 个额外字段,或一个人员和一个约会。

    【讨论】:

    • 我猜只是“似乎”错了。我不需要该字段中的任何数据,我只是不能或不知道如何在验证失败时从 post 操作再次填充该字段,因为它不是我要返回的 Person 对象的一部分视图。
    【解决方案2】:

    我认为这是完全正确的做法。 viewmodel 是视图的模型而不是非 UI 处理的模型,它包含一个 Person 和额外的可查看信息。它完全符合这个概念。您的 Person 可能是一个(非视图)模型,因此当您有一个有效的回发时,您可以让 Person 保存它的数据(或其他),此时额外的可查看信息是无关紧要的,因为您不再在应用程序的“视图/UI”部分。 使视图强类型化到您的视图模型并访问其中的人员

    @model myViewModel
    
    @Model.Person.FirstName
    @Model.OtherViewOnlyValue
    

    使用视图模型,比 ViewBags/Session/ViewData 等干净得多。

    【讨论】:

      【解决方案3】:

      很多时候您可能认为不需要将 UI 映射包含到 ViewModel,但大多数时候您最终会将映射添加到 ViewModel。我相信 ViewModel 应该代表您的 UI 屏幕上的所有内容。由于 HTTP 是无状态的,因此 post 表单值将在填充用户界面控件方面发挥重要作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-20
        • 2019-01-12
        • 1970-01-01
        相关资源
        最近更新 更多