【发布时间】:2012-09-15 08:56:10
【问题描述】:
在 mvc 项目中,有人可以向我解释一下模型和视图模型之间的区别吗?
我的理解是视图模型代表视图的数据,例如。 cshml,但模型表示部分视图的数据。这是否正确。我看到了在不同情况下使用的名称,这让我感到困惑,因此寻找方向。
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-mvc-4 viewmodel models
在 mvc 项目中,有人可以向我解释一下模型和视图模型之间的区别吗?
我的理解是视图模型代表视图的数据,例如。 cshml,但模型表示部分视图的数据。这是否正确。我看到了在不同情况下使用的名称,这让我感到困惑,因此寻找方向。
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-mvc-4 viewmodel models
模型是您的领域。例如,我们可能有一个客户模型。我们可以在我们的域中使用这个客户。我们可以为这个客户下订单。我们可以更新客户的联系方式等等。
// 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 应用程序中,您可能会包含一些其他依赖项。因此,您将使用的“模型”将是视图模型。
【讨论】:
一般来说,在 ASP.NET 世界中,当人们提到模型时,指的是“域模型”,它们通常是数据库表和 C# 类之间的 1-1 映射。
当提到视图模型时,这些是帮助在视图 (.cshtml) 和控制器之间传递数据的便利类。 视图模型应包含与视图相关的数据,其中可能包含域模型的聚合数据(例如,名为“FullName”的属性,它是“FirstName”和“LastName”的组合)或分页信息等。
就我个人而言,我更喜欢使用视图模型以简单的形式将数据呈现给视图,并且我让控制器操作获取视图模型的实例,构建域模型并直接或通过服务层对其进行操作。
【讨论】:
一般来说,视图模型保存特定视图/屏幕/部分视图的数据,而模型是代表业务对象或实体的对象。
【讨论】:
请查看以下帖子,您的问题已成功回答: ASP.NET MVC Model vs ViewModel
希望对你有帮助
【讨论】: