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

itc*_*mpi 16 asp.net-core-mvc asp.net-core

在以前的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; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

tom*_*dox 25

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

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

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

官方文档广泛讨论了视图模型. ASP.NET Core MVC概述部分有这样的说法:

模范职责

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

在"使用视图呈现HTML"部分中:

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

MVC /高级/应用程序部分部分还讨论了视图模型,示例代码显示了如何将多个不同的对象组合在一起以供视图模型使用.

他们还在部分视图部分提到了它们.还有的是,与随之而来的一些示例代码在这里,但这些例子并不居然真的突出的模型和视图模型之间的区别.

通过以下文档搜索也更加突出: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; }
}
Run Code Online (Sandbox Code Playgroud)

这只是一个例子,重点是您可以使用视图模型来封装视图所需的所有数据,而不是您的控制器返回与单个域对象(通常是数据库中的表)匹配的模型对象,然后是批次使ViewData集合中其余页面功能所需的其他数据(例如填充下拉列表所需的数据).关于视图模型有许多优秀的文章,例如,前面的问题详尽地介绍了它们,并且在.NET MVC Core中与其他版本的MVC一样具有相关性.

"我需要把它们放在哪里?"

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