2

在 mvc 项目中,有人可以向我解释模型和视图模型之间的区别吗?

我的理解是视图模型代表视图的数据,例如。cshml,但模型表示部分视图的数据。这是否正确。我已经看到在不同情况下使用的名称让我感到困惑,因此寻找方向。

4

4 回答 4

5

模型是您的领域。例如,我们可能有一个客户模型。我们可以在我们的域中使用这个客户。我们可以为这个客户下订单。我们可以更新客户的联系方式等等。

// Domain object, encapsulates state.
class Customer 
{   
   public void PlaceOrder() {...}
   public void UpdateContactDetails() { ... }
}

视图模型是一种以简单方式呈现数据的方式。例如,我们可能有一个客户视图模型。这将是一个简单的 DTO(数据传输对象),它允许我们向客户展示视图。视图模型通常是从​​模型创建的——通常会发生某种形式的转换。

// DTO - exposes state - no domain logic
class CustomerViewModel
{
    public string Name { get; set; }
    public int Id { get; set; }
}

使用视图模型而不是在视图中使用域对象的好处是,您不必公开域的内部结构来简化表示逻辑。我应该补充一点,视图模型是一种控制模型绑定的方式,例如,如果您公开了一个数据库记录,您可能不希望整个记录都是可绑定的。使用视图模型意味着只有模型上的那些参数将被绑定。因此,从安全的角度来看,使用视图模型很重要。这里的替代方案是使用白名单来控制模型绑定过程中使用的内容 - 自然这很乏味且容易出错。

就 ASP.NET MVC 而言 - 模型一词在某种程度上可以互换使用。在“现实世界”项目中,您的域可能很复杂,不会驻留在 Web 应用程序中,您可能会包含一些其他依赖项。因此,您将使用的“模型”将是视图模型。

于 2012-09-23T20:17:19.960 回答
3

一般而言,在 ASP.NET 世界中,当人们提到模型时,指的是“域模型”,它们通常是数据库表和 C# 类之间的 1-1 映射。

当提到视图模型时,这些是帮助在视图(.cshtml)和控制器之间传递数据的便利类。视图模型应该包含与视图相关的数据,其中可能包含域模型的聚合数据(例如,名为“FullName”的属性,它是“FirstName”和“LastName”的组合)或分页信息等。

就个人而言,我更喜欢使用视图模型将数据以简单的形式呈现给视图,并且我让控制器操作获取视图模型的实例,构建域模型并直接或通过服务层对它们进行操作。

于 2012-09-23T20:43:36.903 回答
0

我想说的是,通常视图模型保存特定视图/屏幕/部分视图的数据,而模型是表示业务对象或实体的对象。

于 2012-09-23T20:17:26.120 回答
0

请查看以下帖子,您的问题已成功回答: ASP.NET MVC Model vs ViewModel

希望这可以帮助

于 2012-09-23T20:34:09.587 回答