Author Image

admin

2周前 81

ASP.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。

我们将在即将到来的视频中详细讨论路由参数和约束。