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字符:
- 在组件中设置
ViewData传递标题:
@page "/expert/{advisorId:int}" @inject IViewDataDictionary ViewData @code { [Parameter] public int advisorId { get; set; } protected override void OnInitialized() { ViewData["PageTitle"] = "Кириллица"; } }
- 在
_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
相关产品推荐
相关产品推荐

