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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:27:35