学习新知识需要投入时间、空间和精力。我目前正在学习Asp.Net Core MVC 2.0。这篇ASP.NET Core教程总览中指出:
Razor Pages 是使用 ASP.NET Core 创建 Web 用户界面的推荐方法。
对于我来说,这些信息让我困惑了,不知道是应该停止学习Asp.net Core MVC然后开始学习Asp.net Core Razor Pages。
- 为什么Razor Pages在Asp.net Core中是创建Web用户界面的推荐方法?
欢迎提供任何指导。
学习新知识需要投入时间、空间和精力。我目前正在学习Asp.Net Core MVC 2.0。这篇ASP.NET Core教程总览中指出:
Razor Pages 是使用 ASP.NET Core 创建 Web 用户界面的推荐方法。
对于我来说,这些信息让我困惑了,不知道是应该停止学习Asp.net Core MVC然后开始学习Asp.net Core Razor Pages。
欢迎提供任何指导。
从这篇Microsoft文档中:
MVC:使用控制器和视图,应用程序通常具有非常庞大的控制器,处理许多不同的依赖关系和视图模型,并返回许多不同的视图。这导致了很多复杂性,并经常导致控制器没有有效地遵循单一职责原则
或开闭原则
。
Razor Pages解决了这个问题,通过封装给定逻辑“页面”的服务器端逻辑,在Web应用程序中。一个没有服务器端逻辑的Razor Page可以简单地由一个Razor文件(例如“Index.cshtml”)组成。然而,大多数非平凡的Razor Pages都会有一个相关的页面模型类,按照惯例,它的名称与带有“.cs”扩展名的Razor文件相同(例如,“Index.cshtml.cs”)。这个页面模型类结合了Controller和ViewModel的职责。页面模型处理程序像“OnGet()”一样处理请求,通过默认渲染其关联页面来执行。
Razor Pages简化了在ASP.NET Core应用程序中构建单个页面的过程,同时仍然提供了所有ASP.NET Core MVC的架构特性。它们是新页面功能的良好默认选择。
何时使用MVC:
如果你正在构建Web API,MVC模式比尝试使用Razor Pages更有意义。如果你的项目只会暴露Web API端点,你应该从Web API项目模板开始,但是对于任何ASP.NET Core应用程序来说,添加控制器和相关的API端点也很容易。如果你正在将现有应用程序从ASP.NET MVC 5或更早版本迁移到ASP.NET Core MVC,并且希望付出最少的努力,那么你还应该使用基于视图的MVC方法。一旦完成了初始迁移,你可以评估是否有必要采用Razor Pages作为新功能甚至整体迁移。更新:我在这个GitHub问题上读到了一些由Scott Sauber评论的原因:
我们正在为一个[复杂的]医疗保险门户网站使用Razor Pages...我们有60多个页面,我可以说对于服务器呈现的HTML,我永远不会回到MVC。这也不仅仅是为了简单的事情。健康保险领域本质上是复杂的,再加上它是一个多租户应用程序(我们将产品销售给其他保险公司),这增加了更多的复杂性,因为不同的保险公司会以稍微不同的方式处理事情。
为什么使用它?
Razor Pages更加安全。 Razor Pages默认提供AntiForgeryToken验证。此外,您可以通过[BindProperty]选择要绑定到模型的属性,从而限制了过度发布攻击的风险。
Razor Pages具有更好的文件夹结构,可扩展性更强。 在MVC中,默认的文件夹结构不具备扩展性。将视图、控制器和ViewModel分别放在不同的文件夹中,尽管这三个元素最终紧密耦合,但是工作起来非常麻烦。每次需要添加或更改功能时,都需要在这3个文件夹之间跳转和导航,这是非常糟糕的。这就是为什么我提倡使用“特征文件夹”。对于Razor Pages,您的PageModel(Controller + ViewModel)与View位于同一文件夹中。您只需按F7键在它们之间切换,这也非常方便。
代码更易于维护,具有更好的可扩展性。 在MVC中,很容易让控制器膨胀到10个以上的操作。通常,这些操作彼此之间没有任何关系(除了可能在两者之间重定向)。这使得在控制器中查找代码变得非常困难。如果控制器中还有私有方法,情况就更糟了,这进一步增加了方法的膨胀。使用Razor Pages,几乎不可能用与页面无关的方法使您的Page Model膨胀。您在PageModel中放置的所有内容都与您的Page相关。
单元测试更容易。 对于控制器,您可能有8个操作,并且注入的某些依赖关系仅与其中一个或两个操作相关。因此,在单元测试单个操作时,您需要不必要地模拟它们或传递null,这两种情况都感觉很恶心(可以使用Builder模式解决这个问题)。对于Razor Pages,您注入的依赖关系100%与您正在处理的GET和POST操作相关。这感觉非常自然。
路由更容易。 在Razor Pages中,默认情况下,路由只匹配您的文件夹结构。这使得嵌套文件夹更容易实现。例如,我们所有的HR管理页面都在/Administrator
文件夹下,而所有的员工页面都在/Employee
文件夹下。我们可以授权整个文件夹,并说该人必须是管理员才能访问/Administrator
的任何子文件夹,这比使用多个控制器组成管理员功能要容易得多。
我认为那就是重点。
更新2:
这篇文章讨论了MVC模式的一些复杂性,虽然没有直接回答问题,但可能会有用:Facebook的一位工程经理(在这里)表示,对于他们“足够”大的代码库和庞大的组织来说,“MVC变得非常复杂,非常快速”,最终得出结论MVC不具备可扩展性。每次尝试添加新功能时,系统的复杂性呈指数级增长,使代码变得“脆弱和不可预测”。这对于某个代码库的新开发人员来说成为了一个严重的问题,因为他们害怕触及代码,以免破坏某些东西。结果是MVC在Facebook上分崩离析。
Asp.Net Core Razor Pages
比 ASP.NET Core MVC
更好,那么为什么 Microsoft
还发布了 ASP.NET Core MVC
?看起来这里的人们更喜欢 MVC
风格,请指导我们何时应该使用 ASP.NET Core MVC
? - Shaiju T该文章有更多关于为什么要使用Razor Pages而不是MVC进行基于页面的工作流程的信息。显然,对于API,您仍然需要使用控制器。[Razor Pages]提供了一种更简单的方式来组织ASP.NET Core应用程序中的代码,使实现逻辑和视图模型更接近于视图实现代码。
它们还提供了一种更简单的方法来开始开发ASP.NET Core应用程序。
ASP.NET Core - Feature Slices for ASP.NET Core MVC,这是一篇较早的MSDN文章,发布于2016年9月,介绍了为什么传统的MVC约定组织视图和控制器可能对大型项目有不利影响。该文章举例说明了四个松散相关的应用程序概念:Ninjas,Plants,Pirates和Zombies。该文章概述了一种通过按特性或责任区域将文件组织成文件夹来结构化它们的方式,而不是使用默认的文件夹约定。
PageModel
中的GET、POST、PUT等操作是100%相关的。 - RickAndMSFTAsp.Net Core Razor Pages
比ASP.NET Core MVC
更好,那么为什么Microsoft
还发布了ASP.NET Core MVC
?看起来这里的人们喜欢MVC
风格,另外这个待办工作完成了吗?请指导我们何时应该使用ASP.NET Core MVC
? - Shaiju T微软正在重新采用WebForms方法简化项目结构,信任“约定优于配置”口号,同时将配置从开发人员隐藏起来,以加快速度。但这样做的缺点是所有内容将再次混合在一起。这看起来不是一个组织得很好的聪明举动。但是...嘿!某些新东西必须吸引开发者对微软的关注。
如果您的页面使用MVC Web API进行RESTful操作,那么使用Razor页面确实更容易。否则,我建议使用Core MVC。
在庞大的项目中,模型和控制器在同一个文件中,维护将是一个噩梦。它适用于只有2个属性长度的类,但违反了OOP的开闭原则。您应该设计并使用一个可以随时间增长(可扩展)且仍然稳定逻辑(无需重构项目)的架构,只需使用相同的模式扩展即可。
Blazor server 有一个奇怪的架构。它使用 SignalR,看起来像一个聊天应用程序。我对这样的应用程序的经验是事件可能会丢失。我不想丢失事件,最好的方式是将它们堆叠起来,并保证像邮件一样被处理。
2013年,开发人员在论坛上问道:“微软的意思是什么,Silverlight不被推荐使用...???” 现在,MVC将被宣布死亡,MVVM将长存。 你可以预计,在大约18个月后,MVC将被逐渐淘汰,而你所花费的时间学习MVC也将被抛弃。 此外,MVVM看起来很简单,但需要一年的时间才能掌握并真正做到正确。