【问题标题】:How to avoid needing a VIewModel for every Model如何避免每个模型都需要一个 VIewModel
【发布时间】:2011-05-06 05:25:25
【问题描述】:

我正在使用 ASP.NET 4 和 MVC3。

通常,我发现我需要一个 ViewModel 来显示我的模型的信息。比如下面这个模型

class Profile
{
   public int UserID { get; set; }
   public string Name { get; set; }
   public DateTime DOB { get; set; }
}

需要隐藏 UserID,但要显示 UserName,所以对于与上述类似的模型,我不得不想出一个 ViewModel,只是将 UserID 更改为 UserName:

class ProfileViewModel
{
   public string UserName { get; set; }
   public string Name { get; set; }
   public DateTime DOB { get; set; }
}

有什么办法吗?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    直到最近,我总是将我的模型传递给我的操作方法,因为我还认为创建具有相同属性名称的视图模型是重复的(它不是)。这给我带来了很多的痛苦。我现在接受了再教育,几乎总是在我的操作方法中专门使用视图模型(当然,总会有将模型直接传递给操作方法的情况)。

    阅读this 的帖子,这是让我转而使用 viewModel 的帖子。这将告诉您以下信息:

    1. 模型和视图模型的区别
    2. 何时应该使用每个。
    3. 如何避免默认模型绑定器的一些安全问题。

    除了链接帖子中的信息之外,您还应该考虑诸如验证之类的事情。我有一个模型实现了IValidateableObject 接口,以确保实体在保存到数据库之前处于有效状态。

    在我的 ASP.NET 应用程序中,我想创建一个允许用户在多个页面上输入信息的多步骤表单。我在这里遇到的问题是 ASP.NET 在模型绑定过程中也使用了IValidatableObject 接口。

    如果您只允许用户输入实体所需信息的子集,则模型绑定器将只能填写所提供的信息。根据您的验证的复杂程度,这可能会导致 ModelState 被标记为无效,因为 整个 实体无效。

    我解决这个问题的方法是让 viewModel 代表每个步骤,每个步骤都有自己的验证。这样,您只需在每个步骤中验证属性。一旦您到达最后一步并且一切都有效,我将使用用户提供的信息创建一个适当的实体。该实体只会对其执行数据库级别的验证检查(字段长度等)

    我的建议不是避免使用 viewModel,而是要了解为什么要使用它们并接受它们。

    【讨论】:

      【解决方案2】:

      不,没有,一旦成员是公开的,它就是公开的。现在,如果 UserID 属性是内部的,那么您就不会有这个问题。

      然而,这里 MVVM 的目标之一是封装有关模型和视图交互的逻辑。即使您在单独的程序集中拥有视图模型和模型并将UserID 属性设置为内部,您仍然应该有一个视图模型;如果更改出现在需要更多功能而不是简单地绑定到模型的地方,那么您就做好了准备。

      直接访问模型总是不行的。

      此外,如果您真的需要,您始终可以使用 T4 模板为您自动生成代码(您可以在原始 CS 文件上使用 Code DOM)为您输出视图模型。

      【讨论】:

        【解决方案3】:

        我通常每个模型有多个 ViewModel - 你必须做出的权衡归结为:

        1. 您是否愿意将业务逻辑(数据注释、显示信息等)与您的(持久性)模型结合起来?
        2. 您是否愿意完全在 View 中完成所有隐藏/显示业务逻辑,而不是使用 Controller + 脚手架来为您做出这些决定?

        创建所有这些 ViewModel 的缺点当然是子类爆炸,但考虑它的正确方法是根据我列出的问题,恕我直言。

        【讨论】:

          猜你喜欢
          • 2018-05-25
          • 2014-08-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-10
          • 2013-03-27
          • 2011-10-16
          • 2019-11-22
          相关资源
          最近更新 更多