이 글은 주로 ASP.NET Core Razor 페이지 라우팅에 대한 자세한 설명을 소개합니다. 편집자는 꽤 좋다고 생각하므로 지금 공유하고 참고용으로 제공하겠습니다. 편집기를 따라 살펴보겠습니다
서버 측 웹 애플리케이션 프레임워크에서 매우 중요한 디자인은 요청이 올바르게 처리될 수 있도록 개발자가 URL을 서버의 리소스와 일치시키는 방법입니다. 가장 간단한 방법은 URL을 디스크의 실제 파일에 매핑하는 것입니다. 이는 ASP.NET 팀이 Razor Pages 프레임워크에서 이를 구현하는 방법입니다.
Razor Pages 프레임워크가 URL을 파일과 일치시키는 방법과 필요에 따라 출력을 변경하기 위해 규칙을 사용자 정의하는 방법에 대해 알아야 할 몇 가지 규칙이 있습니다. Razor Pages를 Web Forms 프레임워크와 비교하는 경우 대체 URL 매개 변수와 URL에서 데이터를 전달하는 메커니즘도 이해해야 합니다.
규칙 1, Razor 페이지에는 루트 디렉터리가 필요합니다. 기본적으로 이 루트 디렉터리는 웹 애플리케이션 프로젝트의 루트 디렉터리에 있는 Pages입니다. Startup
类的ConfigureServices
메서드에서 다른 폴더를 루트 디렉터리로 구성할 수 있습니다. 다음은 응용 프로그램 "Content" 폴더에 위치하도록 루트 디렉터리를 변경하는 것입니다.
public void ConfigureServices(IServiceCollection services) { services .AddMvc(). AddRazorPagesOptions(options => { options.RootDirectory = "/Content"; }); }
Rule 2, URL은 Razor 페이지에 매핑되며 URL에는 파일 확장자가 포함되지 않습니다.
규칙 3, "Index.cshtml"은 기본 문서입니다. 즉,
URL | map file |
---|---|
www.domain.com | /Pages/Index.cshtml |
www.domain.com/index | /Pages/Index.cshtml |
www.domain.com/index | /Pages/Index.cshtml |
www.domain.com/account | / Pages/account.cshtml 또는 /Pages/account/index.cshtml |
在最后一个例子中,URL映射到两个不同的文件 - 根目录中的“account.cshtml”、“account”文件夹中的“index.cshtml”。Razor 页面框架无法识别要选择哪一个文件,因此如果您在应用程序中实际同时拥有这两个文件,那么如果您尝试浏览www.domain.com/account,会抛出如下异常:
AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied:
Page: /account/Index
Page: /account
URL传递参数
就像大多数其它框架一样,参数可以作为查询字符串在 URL 中传递,例如:www.domain.com/product?id=1
;或者,您可以将其作为路由参数传递,因此上述示例将变为www.domain.com/product/1
。URL的一部分必须映射到参数名称,在页面的路由模板来实现的,@page
指令的一部分:
@page "{id}"
该模板告诉框架将页面名称之后URL的第一段作为“id”的路由参数。您可以通过多种方式访问路由参数的值。第一个是使用RouteData
字典:
@page "{id}" { var productId = RouteData.Values["id"]; }
或者,您可以向该页面的OnGet()
方法添加与路由参数相同名称的参数,并将其值分配给公共属性:
@page "{id}" @{ @functions{ public int Id { get; set; } public void OnGet(int id) { Id = id; } } }The Id is @Id
如果您使用的是PageModel
,那么是这样实现的:
using Microsoft.AspNetCore.Mvc.RazorPages; namespace RazorPages.Pages { public class ProductModel : PageModel { public int Id { get; set; } public void OnGet(int id) { Id = id; } } }
@page "{id}" @model ProductModelThe Id is @Model.Id
最后,您可以在公有属性使用BindProperty
特性,并省略该OnGet
方法中的参数。Razor 文件内容保持不变,但是PageModel
代码略有更改:
using Microsoft.AspNetCore.Mvc.RazorPages; namespace RazorPages.Pages { public class ProductModel : PageModel { [BindProperty(SupportsGet = true)] public int Id { get; set; } public void OnGet() { } } }
约束
此外,在此示例中参数的约束是它必须有一个值。URL www.domain.com/product/apple
与www.domain.com/product/21
一样有效,都是可以与路由匹配。如果您希望id
值为整数,则可以通过将数据类型添加到模板来指定约束:
@page "{id:int}"
现在,如果您尝试通过“apple”作为参数值,应用程序将返回404 Not Found状态码。
您可以指定值不是必需的,可以将参数设置为可为空类型:
@page "{id:int?}"
如果您的应用程序允许使用“apple”作为参数值,则可以指定只允许使用A-Z和a-z的字符:
@page "{id:alpha}"
您可以与最小长度要求相结合:
@page "{id:alpha:minlength(4)}"
更多的约束信息,可以查看微软文档。
友好URL
友好的URL能够将 URL 映射到磁盘上的任意文件,打破根据文件名一对一的映射关系。您可以使用这个特性来不改变 URL 以进行SEO优化而不能重命名文件的问题,例如,如果希望所有请求由一个文件进行处理。友好 URL 在Startup
类型的ConfigureServices
方法中配置,调用RazorPagesOption
类的AddPageRoute
方法。以下示例将 URL www.domain.com/product
映射到Razor 页面 “extras”文件夹“products.cshtml”文件:
public void ConfigureServices(IServiceCollection services) { services .AddMvc() .AddRazorPagesOptions(options => { options.Conventions.AddPageRoute("/extras/products", "product"); }); }
如果您在 Web Forms 中使用过友好 URL,则应注意AddPageRoute
方法的参数顺序与 Web Forms MapPageRoute
方法相反,文件路径作为第一个参数。此外,AddPageRoute
将路由模板作为第二参数,而不是路由定义,其中任何约束被单独定义。
最后一个例子说明将所有请求映射到单个文件。如果站点内容存储在特定位置(数据库,Markdown文件),并且由单个文件(例如 “index.cshtml” )负责根据 URL 定位内容,然后将其处理为HTML,则可以执行此操作:
public void ConfigureServices(IServiceCollection services) { services .AddMvc() .AddRazorPagesOptions(options => { options.Conventions.AddPageRoute("/index", "{*url}"); }); }
路由模板(*)通配符表示“全部”。即使使用此配置,磁盘上的现有文件和URL之间的匹配规则仍然正常运行。
总结
Razor 页面中的路由系统非常直观,基于文件位置,但如果需要覆盖默认约定,它也非常强大,可配置。
原文:《Routing in Razor Pages》https://www.mikesdotnetting.com/article/310/routing-in-razor-pages
위 내용은 ASP.NET Core Razor 페이지 라우팅에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!