如何在ASP.NET Core Razor和Blazor页面启用URL与Cookie双文化选择
解决方案
1. 配置双请求文化提供器(URL + Cookie)
在Program.cs中更新本地化配置,同时注册URL路由文化提供器和Cookie文化提供器,让两种方式都能识别并切换文化:
var supportedCultures = new[] { "en", "ja", "zh-CN" }; // 替换为你的目标支持文化 var localizationOptions = new RequestLocalizationOptions() .SetDefaultCulture(supportedCultures[0]) .AddSupportedCultures(supportedCultures) .AddSupportedUICultures(supportedCultures); // 优先从URL路由的culture参数提取文化 localizationOptions.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider { RouteDataStringKey = "culture", UIRouteDataStringKey = "culture", Options = localizationOptions }); // 保留Cookie提供器,作为URL无文化参数时的 fallback localizationOptions.RequestCultureProviders.Add(new CookieRequestCultureProvider { CookieName = CookieRequestCultureProvider.DefaultCookieName }); app.UseRequestLocalization(localizationOptions);
2. 适配Blazor页面路由
给所有Blazor页面(包括Identity组件)的@page指令添加文化参数,让Blazor路由支持带文化前缀的URL:
比如原Identity登录页:
@page "/Account/Login"
修改为:
@page "/{culture:culture}/Account/Login" @page "/Account/Login" <!-- 保留默认路由,兼容无文化前缀的访问场景 -->
在Blazor组件中,可通过NavigationManager生成带文化前缀的跳转链接:
@inject NavigationManager NavManager <a href="@GetLocalizedUrl("ja")">切换为日语</a> @code { private string GetLocalizedUrl(string culture) { var currentPath = NavManager.ToBaseRelativePath(NavManager.Uri); // 替换或添加文化前缀 var cultureRegex = /^\/([a-z]{2})(-[A-Z]{2})?\//; return cultureRegex.test(currentPath) ? $"/{culture}/{currentPath.Replace(cultureRegex, "")}" : $"/{culture}/{currentPath}"; } }
3. 优化文化切换组件,同步支持URL和Cookie
修改你的文化切换局部视图,让下拉选择时既设置Cookie,又跳转到对应文化的URL,保证两种方式同步生效:
<div> <select onchange="switchCulture(this.value)" class="selectpicker" data-width="fit"> @foreach (var culture in cultureList) { <option value="@culture.Value" selected="@(culture.Value == culture!.RequestCulture.UICulture.Name)"> @culture.Text </option> } </select> @Html.AntiForgeryToken() </div> <script> function switchCulture(cultureName) { const currentUrl = window.location.pathname; const targetUrl = replaceCulturePrefix(currentUrl, cultureName); // 提交请求设置Cookie,然后跳转目标URL fetch('/Home/CultureManagement', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: `cultureName=${cultureName}&returnUrl=${encodeURIComponent(targetUrl)}&__RequestVerificationToken=${document.querySelector('input[name="__RequestVerificationToken"]').value}` }).then(() => window.location.href = targetUrl); } function replaceCulturePrefix(url, newCulture) { const regex = /^\/([a-z]{2})(-[A-Z]{2})?\//; return regex.test(url) ? url.replace(regex, `/${newCulture}/`) : `/${newCulture}${url}`; } </script>
后端CultureManagement方法保持不变,它负责写入Cookie并跳转到指定的带文化URL。
4. 确保路由注册顺序
在Program.cs中,先注册MVC路由,再注册Blazor端点,避免路由冲突:
// 注册MVC路由 app.MapControllerRoute( name: "default", pattern: "{culture}/{controller=First}/{action=Index}/{id?}" ); // 注册Blazor相关端点 app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); // 针对Blazor Server项目
核心说明
- 优先级规则:URL中的culture参数优先级高于Cookie,当URL存在文化前缀时优先使用该文化,否则读取Cookie值;
- Blazor适配:通过修改
@page指令让组件识别路由中的文化参数,保证Blazor页面能响应URL文化切换; - 同步更新:文化切换时同时更新Cookie和URL,避免两种方式的状态冲突。
内容的提问来源于stack exchange,提问作者max ray
相关产品推荐
相关产品推荐

