在一个mvc项目中,有人可以向我解释模型和视图模型之间的区别吗?
我的理解是视图模型重新呈现了视图数据,例如。 cshml,但模型表示部分视图的数据。这是否正确。我已经看到在不同情况下使用的名字使我感到困惑,因此寻找方向。
答案 0 :(得分: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 App中,您可能会包含其他一些依赖项。因此,您将使用的“模型”将是“视图模型”。
答案 1 :(得分:2)
一般来说,在ASP.NET世界中,当人们引用模型来引用“域模型”时,这些模型通常是数据库表和C#类之间的1-1映射。
当引用视图模型时,这些是便利类,它们有助于在视图(.cshtml)和控制器之间传递数据。 视图模型应包含与视图相关的数据,其中可能包含域模型的聚合数据(例如,名为'FullName'的属性,即'FirstName'和'LastName'的组合)或者诸如分页信息等。
我个人更喜欢使用视图模型以简单的形式向视图呈现数据,并且我使控制器操作采用视图模型的实例,构建域模型并直接或通过服务层对其进行操作。 / p>
答案 2 :(得分:0)
我认为通常视图模型包含特定视图/屏幕/部分视图的数据,而模型则是表示业务对象或实体的对象。
答案 3 :(得分:0)
请查看以下帖子,您的问题已成功解答: ASP.NET MVC Model vs ViewModel
希望这有帮助