You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:25:32