2

我正在开发一个新项目,并且在看到以前项目的一些困难后,这些困难没有提供足够的视图与模型分离(特别是使用 MVC - 模型和视图开始有点相互渗透),我想使用 MVVM。

我了解基本概念,并且很高兴开始使用它。然而,有一点让我有点难以理解——ViewModel 中应该包含哪些数据?

例如,如果我正在创建一个包含两条数据的 ViewModel,以便可以在一个表单中对其进行编辑,我是否可以像这样捕获它:

public PersonAddressViewModel {
    public Person Person { get; set; }
    public Address Address { get; set; }
}

或像这样:

public PersonAddressViewModel {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string StreetName { get; set; }
    // ...etc
}

对我来说,第一个感觉更适合我们正在尝试做的事情。如果我们正在做更细粒度的形式(也许我们只捕获 FirstName、LastName 和 StreetAddress),那么下降到那个级别可能更有意义。但是,我觉得第一个是正确的,因为我们正在捕获表单中的 ALL Person 数据和 ALL Address 数据。像这样把事情分开似乎没有意义(还有很多额外的工作)。

欣赏任何见解。

4

4 回答 4

2

如果您使用 Person 对象的所有字段,那么使用复杂的视图模型并没有错。但是,如果您只在这里或那里使用一个字段,那么最好只使用您正在使用的那些值来构建您的视图模型。

你可以用任何你喜欢的方式来做你的视图模型,但是拥有它们的全部意义在于视图模型应该被定制为它所代表的视图。

如果您使用 AutoMapper 之类的东西映射到业务或领域模型,那么使用第一种方法也会容易得多,因为对象应该具有相似的定义。

于 2012-10-14T03:36:58.530 回答
0

如果您的 Model 类具有一些敏感属性(即 User 类中的 IsAdmin),则直接使用 Model 类或将它们包装在 ViewModel 类中(如第一个示例中)可能是一个潜在的安全问题。

假设您的控制器操作采用 PersonAddressViewModel 输入参数:

public ViewResult someAction(PersonAddressViewModel personAddress)
{
  //save it
}

恶意用户基本上可以在您的 PersonAddressViewModel 复合对象中设置任何属性,即使您的 UI 不提供此类功能。这是通过 MVC 的默认绑定机制实现的。为避免这种情况,请不要包装敏感模型类或使用Bind 属性

更多信息请参见:Pro ASP.NET MVC 3 Framework 第 3 版,作者:Steven Sanderson、Adam Freeman(第 17 章)

于 2012-10-18T14:37:47.547 回答
0

您没有使用 MVVM。您正在定义 ViewModels,类仅用于查看目的,以避免破坏模型类。在这种情况下,您可以定义您想要的属性以获得最佳利润。在示例中,我将选择第二种解决方案,但这取决于您。

我正在与许多开发人员提供商一起开展一个大项目。在这种情况下,客户让我们定义我们希望保留模型(他们所称的业务实体)以供他们关注的 ViewModel。因为我们是不同的群体,所以没有人担心另一个 ViewModel,所以你甚至可以为一个视图使用一个类,不管另一个视图与第一个视图是否有一点不同。这是 ViewModels 而不是纯模型使用的优势之一。

为了数据绑定,我更喜欢通过 JSON 对象在客户端定义 ViewModel。有了这个,你就可以真正通过knockoutjs、angularjs、backbonejs等来使用MVVM了……

如果你想使用 MVVM 检查 knockoutjs。使用起来非常简单和愉快

于 2012-10-14T07:56:50.773 回答
-1

如果您使用该视图模型来呈现表单,我会投票支持第二种方法,因为您正在组合表单所需的所有视图数据。

于 2012-10-14T03:13:09.467 回答