.NET6 Razor页面锚点路由异常:文化参数缺失与URL错误
问题
我正在基于.NET6构建一个支持3种文化(en、fr、nl)的Razor Web应用程序,目前遇到以下问题:
- 所有锚标签在DOM中生成的链接为空,点击如下Contact链接无任何响应:
<a class="" asp-area="" asp-page="/Contact">Contact</a>
- 手动访问带文化参数的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时自动获取当前请求的文化信息:
- 在Program.cs中注册服务:
builder.Services.AddSingleton<IRouteValueProvider, CultureRouteValueProvider>();
- 创建
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
相关产品推荐
相关产品推荐

