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

Blazor Server预渲染模式下PageTitle西里尔文编码问题求助

Blazor Server预渲染模式下西里尔文编码问题解决办法

问题原因

在Server-Prerendered渲染模式下,Blazor Server预渲染阶段生成HTML时,会默认将非ASCII字符(如西里尔文)转换为HTML实体编码(&#xXXXX;格式),这是框架内置的HTML编码逻辑,用于规避XSS风险。这种编码后的内容浏览器虽然能正常解析显示,但无法直接输出原始UTF-8字符到title标签中。HTML的UTF-8 meta标签仅控制浏览器对页面内容的解析编码,不影响Blazor预渲染时的内容编码行为。

解决方案

方法1:通过JS互操作直接设置标题

利用Blazor的JS互操作,在客户端渲染完成后直接修改页面标题,覆盖预渲染阶段生成的实体编码内容:

@inject IJSRuntime JSRuntime
@page "/expert/{advisorId:int}"

@code {
    [Parameter]
    public int advisorId { get; set; }

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            // 直接设置原始西里尔文标题
            await JSRuntime.InvokeVoidAsync("document.title", "Кириллица");
        }
    }
}

方法2:通过_Host.cshtml动态传递标题

绕过Blazor组件的编码逻辑,直接在预渲染的Razor页面中输出原始UTF-8字符:

  1. 在组件中设置ViewData传递标题:
@page "/expert/{advisorId:int}"
@inject IViewDataDictionary ViewData

@code {
    [Parameter]
    public int advisorId { get; set; }

    protected override void OnInitialized()
    {
        ViewData["PageTitle"] = "Кириллица";
    }
}
  1. 在_Host.cshtml的title标签中直接输出ViewData内容:
<title>@ViewData["PageTitle"]</title>

方法3:自定义无编码的PageTitle组件

实现一个自定义组件,跳过默认的HTML编码逻辑,直接通过JS设置标题:

@inject IJSRuntime JSRuntime
@implements IDisposable

@code {
    [Parameter] public string Title { get; set; } = string.Empty;

    protected override void OnInitialized() => UpdateTitle();
    protected override void OnParametersSet() => UpdateTitle();

    private void UpdateTitle()
    {
        // 非浏览器环境(预渲染阶段)不处理,交给客户端渲染后执行
        if (OperatingSystem.IsBrowser())
        {
            _ = JSRuntime.InvokeVoidAsync("document.title", Title);
        }
    }

    public void Dispose()
    {
        // 可选:页面卸载时恢复默认标题
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:09:55