ViewModel概念在ASP.NET MVC Core中仍然存在吗?

时间:2016-11-27 09:16:20

标签: asp.net-core asp.net-core-mvc

在以前的ASP.NET MVC版本中,您可以找到有关ViewModel的一些信息以及如何在此版本中使用它们。

我想知道为什么我在ASP.NET Core MVC中找不到关于此主题的任何信息?这个概念是否仍然存在,如果是这样,我需要把它们放在哪里?

问题出现了,因为我想为项目制作仪表板。项目是我的网络应用程序的主要入口点。他们有许多关系,例如里程碑。

型号:

public class Project
{
    public int ProjectId { get; set; }
    public string Name { get; set; }

    public ICollection<Milestone> Milestones { get; set; }
    ...
}

public class Milestone
{
    public int MilestoneId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public DateTime Deadline { get; set; }
    public int? ParentId { get; set; }
    public Milestone Parent { get; set; }

    public ICollection<Milestone> Childrens { get; set; }
    ...
}

在ASP.NET Core之前我创建了一个ProjectDashboardViewModel来获取视图的信息。我可以使用相同的方法吗?

3 个答案:

答案 0 :(得分:22)

“这个概念是否仍然存在?” “我可以使用相同的方法吗?”

是的,ViewModel概念仍适用于.NET Core,您仍然可以像以前一样使用它们,即将选择的数据组合成符合特定视图需求的“形状”。

“我在ASP.NET Core MVC中找不到关于此主题的任何信息”

官方文档广泛讨论了视图模型。 The Overview of ASP.NET Core MVC section有这样的说法:

  

模范职责

     

MVC应用程序中的Model表示该状态   应用程序和应该的任何业务逻辑或操作   由它执行。业务逻辑应该封装在模型中,   以及用于持久化状态的任何实现逻辑   应用。强类型视图通常使用ViewModel类型   专门设计用于包含要在该视图上显示的数据;该   controller将从中创建并填充这些ViewModel实例   模型。

In the Rendering HTML with views section

  

您可以使用多种机制将数据传递给视图。最强大的   方法是在视图中指定模型类型(通常称为   作为一个视图模型,以区别于业务领域模型类型),   然后将此类型的实例传递给操作中的视图。我们   建议您使用模型或视图模型将数据传递给视图。

The MVC/Advanced/Application Parts section还讨论了视图模型,the sample code there展示了如何将多个不同的对象组合在一起,供视图模型使用。

他们还提到了他们in the section on Partial Views。有一些示例代码与here一起使用,但这些示例实际上并未突出显示模型和视图模型之间的差异。

通过以下文档进行搜索也会突出显示更多内容:https://docs.microsoft.com/en-us/search/index?search=viewmodel&scope=ASP.NET+Core

“..我想为项目制作一个仪表板”

在您的情况下,您提供的数据只显示一个具有一些子对象的域对象(“项目”)。如果这是您要显示的所有数据,那么您可能不需要视图模型,因为它只是您Project模型的镜像。

但是,如果要在项目仪表板上显示其他信息,例如一些数据汇总了有关正在进行的项目数量的数据,一个项目落后的项目列表等,然后您可以组建一个具有以下属性的视图模型:Project,NumberInProgressPrjects,OverdueProjectsList等。

public class ProjectDashboardViewModel
{
    public Project Project { get; set; }
    public int NumberInProgressProjects { get; set; }
    public ICollection<OverdueProjectInfo> OverdueProjectsList { get; set; }
}

这只是一个例子,关键是你可以使用视图模型来封装视图所需的所有数据,而不是你的控制器返回一个匹配单个域对象的模型对象(通常是数据库中的表)然后在ViewData集合中使页面的其余部分起作用所需的大量附加数据(例如填充下拉列表所需的数据)。有很多关于视图模型的优秀文章,例如this previous question covers them exhaustively,并且在.NET MVC Core中与其他版本的MVC一样重要。

“..我需要把它们放在哪里?”

您可以将它们放在您选择的位置,只需确保在需要时使用using语句。较小项目中的典型惯例是将它们放在名为“ViewModels”的文件夹中。

答案 1 :(得分:3)

ViewModel / MVVM(Model-View-ViewModel)是一种架构模式,不依赖于任何框架或堆栈。

意味着您仍然可以使用它,它只是MVC模式之上的一个额外的抽象层,它以一种形式提供数据,使其易于为视图使用。

答案 2 :(得分:-1)