ASP.NET 核心 Razor 页面与完整 MVC 核心

ASP.NET Core Razor pages vs Full MVC Core

SO 上有一个问题,其中 Steve Smith 从拥有更少文件的角度友好地解释了使用 Razor Pages 而不是完整 MVC 的好处。

我使用 Razor Pages 有一段时间了,我注意到尽管 Razor Pages 具有简单的优点,但在自定义路由、结构化文件夹和复杂视图模型(页面模型似乎杂乱无章)。

所以,问题是:

  1. 如果除了页面的简单性之外还有什么比 Controllers/Views 更喜欢 Razor Pages 的——特别是我对这两个框架的性能感兴趣?
  2. 可以同时合并 Razor Pages 和 Controllers/Views 吗?

如果一些有经验的人分享您关于使用 Razor Pages 以更好地理解此框架的想法(优缺点),我将不胜感激。

我们最近发布了一个相当不错的应用程序,使用 Razor Pages 作为前端,使用 MVC 控制器作为客户端组件 API。我的经历是这样的:

当您的内容围绕网站上的实际 "pages" 构想时,页面范式会很有效。考虑诸如“联系我们”或“关于”甚至“登录”页面之类的内容。当然,这些可以通过 MVC 完成,但 MVC 确实是不必要的。一个简单的页面就足够了。将控制器留给更多类似控制器的东西,例如产品目录或用户数据库。

如果您的 MVC 体系结构主要围绕您的视图结构,razor 页面可能是一个不错的选择。您仍然可以将 MVC 位用于 API 相关的东西,但是页面的好处是您的前端结构变得更加明确而不那么隐含("convention-based"),就像 MVC 一样,每个动作可以或不可以有一个通常以操作命名的视图。

尽管 Chris 对标准 ASP.NET 核心实现附带的框架提出了明确的意见。人们还必须注意到,MS 推荐 Razor Pages 有更深层次的原因,而且我很清楚,因为我是 razor pages 的忠实粉丝。

If there is anything else except simplicity of a page to prefer Razor Pages over Controllers/Views - specifically I'm interested in performance of the two frameworks?

  • 要回答这个问题,如果您问这个问题,您听起来好像您只是没有在 MVC 中完成过真正繁重的应用程序。控制器上堆满了代码,考虑到并不是所有的程序员都遵循良好的编程实践(评论和适当的代码管理),它可能真的很混乱......所以想象一个控制器,其中包含一些带有逻辑的页面方法.那么,结果是您很容易得到一个由 400 多行代码组成的控制器,这些代码很容易被拆分,因为它指的是应用程序的不同部分(页面或方法)。那么,如何打破这 300 多行代码并根据它们的作用将它们分开呢?这就是 razor pages 背后的全部想法。您只需将与特定页面相关的代码放入它自己的模型中,而不是将与 10 个页面相关的代码混合在一个文件中。好吧,其他人可能会争辩说您可以创建外部 类,您可以在其中放置此逻辑以保持控制器清洁,但为什么要多做一些努力呢?其次,性能根本不应该成为问题。我认为目前这并不重要。 Razor Pages 在基于表单的页面方面表现出色,因为模型绑定非常顺畅。

Is it acceptable to combine Razor Pages and Controllers/Views at the same time?

  • 好吧,就 .NET 而言,MVC 是 WebAPI 的巅峰之作。所以两者可以随时混合。 Razor 页面确实类似于“真实页面”,但它们可以灵活地适应任何内容,无论是目录还是您希望构建的任何内容。每个页面都可以满足它自己的请求 GET、POST 等...因此,您可以使用剃刀页面做任何您想做的事情。还必须清楚的是,Razor Pages 的路由并不复杂。它的工作方式与 MVC 一样灵活...

I've been using Razor Pages for a while and noticed that despite an advantage of a Razor Page simplicity, it is a bit complicated when it comes to custom routing, structuring folders and complex view model (page model seem to be cluttered).

  • 我宁愿不同意这一点。 Razor 页面的路由很灵活,您只是没有解决它。剃刀页面也可以构建非常复杂的视图,因为您可以将尽可能多的视图模型绑定到它,而无需任何额外的努力。使用注释规则 [BindProperties][BindProperty],您可以将任意数量的字段导入到视图中...请记住绑定是双向的。

除非您开始使用 Razor 页面,否则您会听到很多关于它的意见,有些会阻止您使用它,有些像 Chris 会给您真实的反馈。但我的建议是,Razor 页面已经发展并在任何规模的任何应用程序中表现最佳......

我希望你觉得这篇文章读起来很有趣。

.Net核心系列

Chris 和 Mosia 给出了很好的答案。克里斯写道

You sound like you simply haven't done a really heavy app in MVC

当我移植 Get started with ASP.NET Core MVC to Get started with Razor Pages in ASP.NET Core. It wasn't until I ported Get started with EF Core in an ASP.NET MVC web app to Razor Pages with Entity Framework Core in ASP.NET Core 时,我发现 Razor Pages (RP) 与带有控制器和视图的 MVC 相比没有显着优势,我发现 Razor Pages (RP) 具有显着的生产力优势。 MVC/EF 绝不接近真正的生产应用程序,它要简单得多。然而它有足够的复杂性来展示 RP 相对于 MVC 的优势。

在与客户的访谈中,我听到的坚持使用 UI 控制器和视图的最常见原因是他们有现有的 controller/view 代码库。

首选 RP 而不是 MVC 的最常见原因是防止控制器膨胀以及页面和视图之间更好的集成。

Razor Pages vs ASP.NET Core MVCWhy choose MVC tutorials over Razor Pages 提供了更多信息并添加了指向所有最佳 MVC VS 的链接。 RP 内容.

Why choose MVC tutorials over Razor Pages 中的许多最佳评论已隐藏。搜索隐藏和 select 加载更多...

我已经经历了一些企业级应用程序的整个 webforms、mvc、SPA 生命周期。这些是我的想法:

  • Webforms 在 html 上变得过于抽象。易于用于简单的演示,但很难自定义到最后一个标签。

  • MVC 打破了一切都留给开发人员的局面。想法是将所有东西分开并将控制权交还给开发人员。不幸的是,它也变得更加复杂,简单的页面分散在三个不同的位置(模型、视图和控制器)。删除功能变得棘手,因为它位于不同的位置,因此人们开始使用功能文件夹将所有 MVC 组件分组以实现单个功能。

  • Razor 页面在我眼中是一个更标准化的功能文件夹,他们在其中合并了控制器和模型以简化生活。我喜欢功能文件夹,出于同样的原因我喜欢 Razor 页面。当它位于一个位置时,它可以更容易地删除功能,这对于更大的解决方案来说是关键。简化工作流程。