ASP.NET Core Razor Pages中的路由介绍
admin
2022-01-12ASP.NET Core Razor Pages中的路由介绍
导航:
在本视频中,我们将讨论ASP.NET Core Razor Pages中路由的基础知识。
Razor Pages中的路由 与MVC一样,ASP.NET Core Razor Pages也使用通过配置和使用约定来控制路由的工作方式。
提示: Razor Pages与MVC的路由的基础结构是一致的,它们的区别仅在于路由的配置方式不同。
在ASP.NET Core MVC中,我们使用基于约定的路由或属性路由来将传入的请求URL与控制器操作进行匹配。
在 Razor Pages中,文件的路径决定了可以访问页面的URL。默认情况下,所有 Razor Pages都位于Pages目录中。
Razor Pages中的默认URL映射
例如,考虑以下文件和文件夹结构。
通过导航到 http://localhost:2221/Index,可以访问Pages文件夹中的Index.cshtml Razor Pages。
https://localhost:1234是主机,/Index
是用于获取Index.cshtml的URL Razor Pages。
URL中不需要填写根文件夹(即Pages)和文件扩展名.cshtml。
Index.cshtml是默认文档。因此,您可以使用以下2条路由之一来实现
https://localhost:1234/
https://localhost:1234/Index
同样的道理,举一反三:
- /Privacy映射到 Pages/Privacy.cshtml
- /Students/Details 映射到 Pages/Students/Details.cshtml
- 2条路由
/Students
和/Students/Index
均映射到Pages/Students/Index.cshtml
AmbiguousMatchException异常:该请求匹配了多个端点
此时,如果我们现在添加一个新的Students.cshtml
Razor Pages到Pages文件夹中。然后导航到/Students/Index,URL(/Students)将引发以下异常,如下图。
这是由于单个URL映射到多个 Razor Pages,因此ASP.NET Core 不知道服务哪个页面,因此会引发异常。
解决此错误的最简单方法是重命名匹配的 Razor Pages名称之一。如果您不想更改 Razor Pages的名称,则可以通过覆盖默认路由或使用route参数来解决此错误。
覆盖默认路由
在 Razor Pages中,默认情况下URL映射到文件系统上的物理文件。但是,我们可以覆盖此默认行为,因此与文件名没有关系。
例如,要访问Pages/Students/Index.cshtml
,我们使用以下URL之一:
/Students(这便是与多个 Razor Pages匹配会抛出异常)
/Students/Index
您可以使用@page指令覆盖此默认路由,如下所示
@page "/StudentList"
一旦有了此指令,就只能使用/StudentList
来访问(Pages/Students/Index.cshtml)。/Students/Index
将在下面的示例中产生404 Notice,该路由不是以斜杠(/或〜/)开头。
因此,此路由段是相对的,您必须使用URL/StudentList
来到达(Pages/Students/Index.cshtml)
Razor Pages路由参数
我们还可以使用路由参数来重载AmbiguousMatchException
。路径参数使用花括号指定。
@page "/Students/{name}"
您可以为name参数传递任何值。ABC,ltm,123等
。因此,以下所有URL都映射到Pages/Students/Index.cshtml
Razor Pages。
/Students/ABC
/Students/ltm
/Students/123
以上的url地址,同样会映射到/Students/Index.cs 的 Razor Pages。
除了以上的办法我们还可以指定对路由参数的约束。
好的,现在为了我们后面的开发可以正常运作,现在我们删除在Pages文件夹中的Students Razor Pages,同时将Pages/Students/Index.cshtml
的路由,还原为仅保留@page。
我们将在即将到来的视频中详细讨论路由参数和约束。