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

Blazor Server迁移至.NET 8:MapRazorComponents约定路由实现方案咨询

.NET 8 Blazor Server 实现约定式路由(无需回退到<_Host.cshtml>)

完全不用回退到旧的<_Host.cshtml>托管方式,.NET 8的新托管模型下可以通过两种方式实现类似MVC的约定式路由:

方案一:自定义路由转换器(推荐)

实现IRouteAddressTransformer接口,拦截并转换请求路由,将约定式路径映射到组件的@page定义路由。

1. 创建路由转换器类

public class ConventionRouteTransformer : IRouteAddressTransformer
{
    public ValueTask<RouteAddress> TransformAsync(HttpContext httpContext, RouteAddress address)
    {
        // 示例:将 /products/{id} 映射到 ProductDetail 组件的路由 /ProductDetail/{Id:int}
        if (address.RouteTemplate.StartsWith("/products/") 
            && int.TryParse(address.RouteTemplate.Split('/')[2], out var productId))
        {
            var mappedAddress = RouteAddressFactory.Create(
                "/ProductDetail/{Id:int}", 
                new { Id = productId }
            );
            return ValueTask.FromResult(mappedAddress);
        }

        // 可添加更多约定规则,比如 /users/{name} 映射到 UserProfile 组件
        // ...

        // 不匹配约定的路由,返回原地址
        return ValueTask.FromResult(address);
    }
}

2. 注册并应用转换器

在Program.cs中注册服务,并将转换器绑定到Razor组件路由:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();

// 注册自定义路由转换器
builder.Services.AddSingleton<IRouteAddressTransformer, ConventionRouteTransformer>();

var app = builder.Build();

// 省略中间件配置...

app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode()
    .AddRouteTransformer<ConventionRouteTransformer>(); // 绑定转换器

app.Run();

方案二:手动映射端点路由

如果需要更直接的控制,可以手动将约定式路由映射到组件路径,通过中间件转发请求:

var app = builder.Build();

// 手动映射约定式路由
app.MapGet("/products/{id:int}", async (HttpContext context, int id) =>
{
    // 将请求路径重写为组件的@page路由
    context.Request.Path = $"/ProductDetail/{id}";
    // 继续执行后续中间件(Blazor路由处理)
    await app.RunMiddlewareAsync(context);
});

// 映射Razor组件
app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

注意事项

  • 目标组件必须已通过@page定义对应路由(比如@page "/ProductDetail/{Id:int}"),否则Blazor路由器无法识别转换后的路径。
  • 复杂场景下,可以结合反射扫描组件程序集,根据组件名称、命名空间自动生成约定路由映射,完全复刻MVC的约定逻辑。
  • 注意路由优先级,避免约定路由与已定义的组件路由冲突。

内容的提问来源于stack exchange,提问作者Matěj Štágl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:52:15