.NET 7 Razor Pages多路由规则不生效问题求助
.NET 7 Razor Pages 自定义路由与永久重定向解决方案
一、实现自定义路由直接访问页面
Razor Pages的路由机制和MVC不同,不能直接在Program.cs中套用MVC的路由配置方式,需通过页面路由约定或显式路由映射绑定自定义路由到目标页面:
方式1:通过路由约定绑定自定义路由
在Program.cs的AddRazorPages配置中,为Flights页面添加自定义路由模板:
builder.Services.AddRazorPages(options => { // 绑定自定义路由到Pages/Flights.cshtml页面 options.Conventions.AddPageRoute("/Flights", "/flights/to-{ToIata:length(3)}-{CityName}"); options.Conventions.AddPageRoute("/Flights", "/flights/from-{FromIata:length(3)}-{CityName}"); });
然后在Flights.cshtml.cs中接收路由参数:
public class FlightsModel : PageModel { [FromRoute] public string? FromIata { get; set; } [FromRoute] public string? ToIata { get; set; } [FromRoute] public string? CityName { get; set; } public async Task<IActionResult> OnGetAsync() { // 此处处理页面业务逻辑,比如根据IATA码查询航班数据 return Page(); } }
方式2:显式路由映射(仅重定向场景适用)
如果不需要自定义路由直接渲染页面,仅需重定向到标准路由,可直接在Program.cs中用MapGet绑定自定义路由并返回重定向:
// 配置自定义路由的重定向规则 app.MapGet("/flights/to-{ToIata:length(3)}-{CityName}", (string ToIata, IUrlHelperFactory urlHelperFactory, HttpContext context) => { var urlHelper = urlHelperFactory.GetUrlHelper(context); var standardUrl = urlHelper.Page("/Flights", new { ToIata }); // 返回301永久重定向 return Results.Redirect(standardUrl, permanent: true); }); app.MapGet("/flights/from-{FromIata:length(3)}-{CityName}", (string FromIata, IUrlHelperFactory urlHelperFactory, HttpContext context) => { var urlHelper = urlHelperFactory.GetUrlHelper(context); var standardUrl = urlHelper.Page("/Flights", new { FromIata }); return Results.Redirect(standardUrl, permanent: true); }); // 最后映射Razor Pages标准路由 app.MapRazorPages();
二、实现自定义路由访问时永久重定向到标准路由
如果用方式1配置了自定义路由可直接访问页面,需在页面逻辑中判断当前请求路径是否为自定义路由,若则重定向到标准路由:
在Flights.cshtml.cs的OnGetAsync方法中添加重定向逻辑:
public async Task<IActionResult> OnGetAsync() { // 构建标准路由URL string standardUrl; if (!string.IsNullOrEmpty(ToIata)) { standardUrl = Url.Page("/Flights", new { ToIata = ToIata }); } else if (!string.IsNullOrEmpty(FromIata)) { standardUrl = Url.Page("/Flights", new { FromIata = FromIata }); } else { standardUrl = Url.Page("/Flights"); } // 判断当前请求路径是否与标准路由不一致 if (!Request.Path.Equals(new PathString(standardUrl), StringComparison.OrdinalIgnoreCase)) { return RedirectPermanent(standardUrl); } // 正常处理页面业务逻辑 return Page(); }
关键说明
- Razor Pages核心路由依赖
@page指令和页面文件结构,自定义路由必须通过路由约定或显式映射绑定到对应页面; - 301永久重定向有利于SEO,可将旧路由的权重转移到标准路由;
- 若同时需要自定义路由可访问页面且重定向,推荐方式1+页面内重定向逻辑;若仅需重定向,方式2更简洁高效。
内容的提问来源于stack exchange,提问作者Trevor
相关产品推荐
相关产品推荐

