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

.NET6 Razor页面锚点路由异常:文化参数缺失与URL错误

问题

我正在基于.NET6构建一个支持3种文化(en、fr、nl)的Razor Web应用程序,目前遇到以下问题:

  1. 所有锚标签在DOM中生成的链接为空,点击如下Contact链接无任何响应:
<a class="" asp-area="" asp-page="/Contact">Contact</a>
  1. 手动访问带文化参数的URL(如http://www.website.com/fr/contact-us)可正常打开页面,但点击如下Home锚点后,URL变为http://www.website.com/fr/contact-us/Index,路径出现错误:
<a asp-area="" asp-page="/">Home</a>

我的Program.cs配置代码

var builder = WebApplication.CreateBuilder(args);


builder.Services.AddRazorPages()
    .AddRazorPagesOptions(options =>
    {
        options.Conventions.AddFolderRouteModelConvention("/", model =>
        {
            foreach (var selector in model.Selectors)
            {
                selector.AttributeRouteModel.Template = AttributeRouteModel.CombineTemplates("{culture?}", selector.AttributeRouteModel.Template);
            }
        });
    });
builder.Services.AddMvc().AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix).AddDataAnnotationsLocalization();
builder.Services.Configure<RequestLocalizationOptions>(opt =>
{
    var supportedCultures = new List<CultureInfo>
    {
        new CultureInfo("en"),
        new CultureInfo("fr"),
        new CultureInfo("nl")
    };
    opt.DefaultRequestCulture = new RequestCulture("en");
    opt.SupportedCultures = supportedCultures;
    opt.SupportedUICultures = supportedCultures;
    opt.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider()
    {
        RouteDataStringKey = "culture",
        UIRouteDataStringKey = "culture",
        Options = opt
    });
});

builder.Services.AddHttpContextAccessor();

builder.Services.AddLocalization(opt => { opt.ResourcesPath = "Resources"; });

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

var options = ((IApplicationBuilder)app).ApplicationServices.GetRequiredService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(options.Value);

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

//app.UseRequestLocalization(((IApplicationBuilder)app).ApplicationServices.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value);

app.MapRazorPages();

app.Run();
解决方案

问题1:锚标签生成空链接的修复

当前路由配置未让锚标签助手自动填充culture路由值,导致生成的URL缺失必要参数,最终呈现为空链接。

需要添加自定义路由值提供器,让锚标签助手生成URL时自动获取当前请求的文化信息:

  1. 在Program.cs中注册服务:
builder.Services.AddSingleton<IRouteValueProvider, CultureRouteValueProvider>();
  1. 创建CultureRouteValueProvider类:
public class CultureRouteValueProvider : IRouteValueProvider
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public CultureRouteValueProvider(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public IDictionary<string, object> GetRouteValues()
    {
        var culture = _httpContextAccessor.HttpContext?.Features.Get<IRequestCultureFeature>()?.RequestCulture.Culture.Name;
        return string.IsNullOrEmpty(culture) ? new Dictionary<string, object>() : new Dictionary<string, object> { { "culture", culture } };
    }
}

该类会自动从当前请求中提取文化值,锚标签助手生成URL时会自动带上这个路由参数。

问题2:Home锚点路径错误的修复

当前路由约定配置对根页面(/)的模板处理逻辑有误,导致从子页面跳转时生成嵌套路径。

修改AddFolderRouteModelConvention中的逻辑,单独处理根页面路由:

builder.Services.AddRazorPages()
    .AddRazorPagesOptions(options =>
    {
        options.Conventions.AddFolderRouteModelConvention("/", model =>
        {
            foreach (var selector in model.Selectors)
            {
                var currentTemplate = selector.AttributeRouteModel.Template;
                // 根页面模板为空,直接设置为{culture?}
                selector.AttributeRouteModel.Template = string.IsNullOrEmpty(currentTemplate) 
                    ? "{culture?}" 
                    : AttributeRouteModel.CombineTemplates("{culture?}", currentTemplate);
            }
        });
    });

修改后,根页面的路由会正确映射到/{culture?},点击Home锚点时会生成/fr或/en这类正确路径。

额外注意事项

  • 确保UseRequestLocalization放在UseRouting之前,当前代码中位置正确,无需调整。
  • 验证所有页面的路由模板是否与文件结构对应,比如Contact页面需确保对应/Contact路由。

内容的提问来源于stack exchange,提问作者Korpin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:57:24