【问题标题】:Convert ASP.NET MVC to ASP.NET Core Razor Pages将 ASP.NET MVC 转换为 ASP.NET Core Razor 页面
【发布时间】:2021-05-13 06:31:30
【问题描述】:

我有一个 10 多年前的 ASP.NET MVC 应用程序,我正准备更新/升级到 ASP.NET Core 5。我正在尝试决定是否坚持使用 MVC 方法,这可能会使升级过程更容易或切换到 Razor 页面。这是一个相当大的应用程序,应用程序中使用的模型来自解决方案中的库项目。

话虽如此,我有两个问题:

  1. 旧版应用程序中的某些页面允许大量小的编辑场景,并且它们在控制器中具有相应的操作方法。我知道对于剃须刀页面,我不使用控制器。相反,所有代码都在页面后面的代码中。是否可以/建议在剃须刀页面的代码中使用 20 多种操作方法。此操作方法将支持那些编辑场景。
  2. 如上所述,MVC 应用程序中使用的所有模型都来自库项目。我很确定这个问题的答案是肯定的,但我想确保我仍然可以对 Razor 页面执行相同的操作,并使用库项目中现有的类作为我的 razor 页面的模型。

【问题讨论】:

  • 我认为你应该混合使用 MVC 和 razor 页面。 Razor 页面的思想是将页面逻辑彼此分离(每个都与相应的视图配对)。所以这当然不能完全从 MVC 改编,因为我们知道 MVC 中的一些端点可以在多个页面/视图中使用。处理程序的数量没有限制,只要它们都用于一页就可以了。
  • 我建议你在这个SO问题stackoverflow.com/a/48844411/3559462上查看这个答案,里面有详细的分析,你也可以查看其他答案

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


【解决方案1】:

Razor Pages 中的代码称为 PageModel 文件,是一个组合的页面控制器和视图模型。它旨在处理对其合作伙伴内容页面(Razor 视图文件)的请求。标准请求处理程序方法命名为On[Http Verb Name],末尾带有可选的Async,例如OnGetOnPostAsync。每个 HTTP 动词只能有其中之一。但是,您可以拥有无​​限的named handler methods,您可以在动词之后和Async 之前插入“名称”,例如OnPostUpdateEmailAsync, UpdateEmail 是“名字”。

您可能会使用这些,因为您的页面包含多个表单,并且您希望将处理每个表单的代码分开,而不是使用某种条件逻辑来填充您的 OnPost 方法来识别发布了哪个表单。或者,您可以使用它们来处理您所描述的复杂页面中的离散 AJAX 编辑。

如果您的多个编辑场景由 AJAX 驱动并使用 JSON 数据,您还可以考虑使用 API 控制器而不是命名的处理程序方法。

Razor Pages 基于 MVC 构建,与 MVC 一样灵活和强大。两者的主要区别是

  • 控制器和视图之间的关系(一对一而不是一对多)
  • 构建路由的基础(基于页面文件路径)
  • 更简单、更符合逻辑的 (IMO) 项目文件夹结构

您可以在 .NET Core (Is it possible to reference .net framework 4.7.2 class library from an ASP.NET Core MVC project?) 中使用现有的 .NET Framework 库,尽管您可能更愿意将库移植到 .NET Core:https://docs.microsoft.com/en-us/dotnet/core/porting/

【讨论】:

  • 感谢您的详细解释!一个快速跟进的问题,如果可以的话,我该如何使用,比如 .NET Standard 库中的 class 作为剃须刀页面的 ViewModel?例如,我的.NET Standard 类库中有一个复杂的PerformanceMonitor.cs 类,我在ASP.NET Core Razor Pages 项目中引用了它,我想将此PerformanceMonitor 类用作我的ViewModel,或者至少,我希望我的ViewModel 使用PerformanceMonitor 作为其基础。我该怎么做?
  • 基本上,我希望剃须刀页面ViewModels 来包装我的域对象
  • 我可以添加一个域对象作为我的IndexModel 的属性,但是我必须使用我分配给它的属性名称来访问我的域对象的数据或属性。因此,在剃须刀页面中,我可以以@Model.PerformanceMonitor.MyDataPoint 的身份访问我的PerformanceMonitor。这是在剃刀页面中使用域对象的正确方法吗?我觉得一定有更好的方法。
  • 是的,你会这样做。就像您将 PerformanceMonitor 作为属性添加到 MVC ViewModel 类一样。
  • 谢谢!感谢您的帮助!
猜你喜欢
  • 2020-08-22
  • 2023-02-02
  • 2019-08-04
  • 2018-06-15
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2019-05-22
相关资源
最近更新 更多