【问题标题】:ViewModel != Domain ModelViewModel != 领域模型
【发布时间】:2014-08-23 05:02:12
【问题描述】:

在浏览 mvc 中的最佳实践时,我发现 DomainModel!=ViewModel

所以如果我需要显示所有员工的详细信息,例如姓名、年龄、地址。 我有一个 EmployeeModel 类,即域类,它具有像 Id、Name、Age、Addresss、Department 这样的属性。在我看来,我只需要显示姓名、年龄、地址,所以我是否需要创建一个视图特定的 EmployeeViewModel,其中包含名称、年龄、地址等道具,并使用自动映射器或控制器中的其他东西将其映射到 EmployeeModel? 或者我可以在 EmployeeViewModel 中重用现有的 EmployeeModel 即在 EmployeeViewModel 中创建一个 EmployeeModel 属性? 最佳做法是什么?

public class EmployeeModel
{ 
 public int EmployeeId {get ; set} 

public string Name{get ; set}

public string Age{get ; set}

public string Department{get ; set}

}

那么我会创建一个这样的 ViewModel 吗?

public class EmployeeViewModel
{  

public string Name{get ; set}

public string Age{get ; set}

public string Department{get ; set}

}

或者我会创建这样的视图模型吗?

  public class EmployeeViewModel
    {  

     public EmployeeModel employeeModel {get; set;}

    }

谢谢

【问题讨论】:

  • viewmodel 非常适合在我们想要合并两个或多个模型或模型复杂的情况下使用。在您的情况下,您只能创建一个简单的模型...
  • 嗨,这个例子只是为了说明,我的观点会变得复杂。这就是我发布这个的原因?
  • 那么第三种情况最好...
  • 我认为第二种情况最好。如果我们按照上面的示例进行,我的视图中只需要 3 个属性(姓名、年龄、部门)。因此,如果我们按第 3 种情况进行分析,您会直接将具有 4 个属性的模型暴露给您的视图,对吗?所以我们可能会间接地将我们的视图模型与模型混合在一起??
  • 最好只使用您的属性保持干净的ViewModel。这样你就可以保持你的model干净并在你的ViewModel中添加你的验证规则。

标签: asp.net-mvc model viewmodel


【解决方案1】:

如果您的视图会很复杂,请创建与您的域/实体模型分开的视图模型。

不要试图将你的领域模型封装在你的视图模型中;我发送的关于拥有视图模型的意见是,您的视图的绑定和逻辑封装是微不足道的,并且是针对您的视图量身定制的。包含域模型的那一刻,事情就变得复杂了。

哦,还有查找自动映射器。这将消除一些(不是全部)映射的痛苦。

【讨论】:

  • 谢谢。连我自己都这么认为。但大多数时候人们质疑“重用”这个说法。 !我们有两个相似的类,它们具有几乎相同的属性集。那我们为什么不在 ViewModel 中重用 Model 类而不是使用不同的 ViewModel 类。我该如何证明呢?
【解决方案2】:

我会使用 ViewModel 中的属性。它使您的模型更清洁。您可以改为在 ViewModel 中处理您的验证。它还可以让您的 ViewModel 远离不必要的属性和关系(在某些情况下)。

public class EmployeeViewModel
{  

[Requried]
public string Name{get ; set}

public string Age{get ; set}

public string Department{get ; set}

}

【讨论】:

  • 谢谢。连我自己都这么认为。但大多数时候人们质疑“重用”这个说法。 !我们有两个相似的类,它们具有几乎相同的属性集。那我们为什么不在 ViewModel 中重用 Model 类而不是使用不同的 ViewModel 类。我该如何证明呢?
  • @MichaelKovattil 嗯,这是一种懒惰而简单的做事方式。当您的项目规模扩大时不太好。您的 ViewModel 代表您在视图中使用的属性。您可以更灵活地使用属性,更不用说以这种方式更好地控制验证了。你保持你的模型没有验证属性。在两个 ViewModel 中使用相同的模型,在一个 ViewModel 中您需要验证某些属性,而在另一个中不需要。现在尝试验证您的模型并没有通过其中一个视图。你如何解决这种情况?这只是好处之一。
  • @MichaelKovattil 您获得了其中一项好处?清洁和验证。您可以使用 AutoMapper 之类的工具从 ViewModel 中填充模型,或者如果您认为这需要大量工作,则可以使用其他方式。
猜你喜欢
  • 2012-06-21
  • 2010-12-20
  • 2014-01-05
  • 2012-09-04
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
相关资源
最近更新 更多