如何在ASPNET MVC3中使用ViewModel

时间:2011-07-11 20:22:55

标签: asp.net-mvc

我正在尝试学习ASPNET MVC,所以很抱歉新手问题:我已经从DB结构开始构建了一个DbModel,所以在Models下,我有.edmx文件可以用来访问数据。

我已经读过,让ViewModels类在View和Model之间进行操作(对于单字段格式化也很有用)可能会很好,但我不明白这是否正确以及哪种方式更好构建它们:如果它们在我的模型中重现类,我相信它有点多余,不是吗? 如果这是正确的方法,有没有办法自动生成ViewModel类?

3 个答案:

答案 0 :(得分:3)

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
}

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

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

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

答案 1 :(得分:2)

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

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

此外,通过执行此操作,您将看到简单域模型不会删除它的视图,您将发现自己需要ViewModel。这将允许您合并视图页面所需的更具体的信息(例如多个域对象)。

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

答案 2 :(得分:1)

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