【问题标题】:ViewModel concept still exists in ASP.NET MVC Core?ASP.NET MVC Core 中还存在 ViewModel 概念吗?
【发布时间】:2017-04-11 04:13:51
【问题描述】:

在以前的 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 来获取视图的信息。我可以使用相同的方法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    模型职责

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

    In the Rendering HTML with views section:

    您可以使用多种机制将数据传递给视图。最健壮的 方法是在视图中指定模型类型(通常称为 作为视图模型,以将其与业务域模型类型区分开来), 然后将这种类型的实例从动作传递给视图。我们 建议您使用模型或视图模型将数据传递给视图。

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

    他们还提到了他们in the section on Partial Viewshere 附带了一些示例代码,但这些示例实际上并没有真正突出模型和视图模型之间的区别。

    通过以下文档搜索也可以看到更多内容: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”的文件夹中。

    【讨论】:

    • 良好的反应。指向“相同代码”的链接已损坏。
    • 感谢您让我知道@Snympi,看起来他们稍微重组了 repo。我现在已经修复了那个链接。
    【解决方案2】:

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

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

    【讨论】:

    • 一般我知道这是一种架构模式,但我想知道为什么我在 asp.net 核心中找不到任何关于 MVVM 的信息,但在 asp.net mvc 的其他变体中...这就是为什么我问你。 请不要对我的问题投反对票!首先回答整个问题。
    • 没有特别的原因。大多数教程或文章要么涵盖新功能(配置、新功能),要么涵盖基本教程(对于一个简单的示例,带有 VM 的 MVC 会被过度设计)。而带有 MVC 的 VM 显然并不是什么新鲜事。官方的 ASP.NET Core 示例项目(MusicStore)仍在使用github.com/aspnet/MusicStore/tree/rel/1.1.0/samples/MusicStore/…
    • 另外,您希望我们如何告诉您为什么博主在编写示例时不发布它,这取决于此类来源的作者是否添加或忽略它
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多