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

Blazor中MarkupString与String.Format配合使用失效问题

解决Blazor Server中资源文件字符串HTML标签不解析的问题

一、修正资源文件的转义问题

你的App.resx里的HTML标签被双重转义(&amp;lt;是<的二次转义),导致读取后得到的是转义文本而非原始HTML标签。直接修改资源文件内容,使用未转义的HTML结构:

<data name="Test" xml:space="preserve">
    <value>You have done <span class="text-primary text-bold">{0}</span> tests.</value>
</data>

注:如果通过Visual Studio资源编辑器添加文本,直接输入<span class="text-primary text-bold">{0}</span>即可,编辑器会自动处理XML标准的单次转义,读取时Localizer会还原为原始HTML标签。

二、正确使用MarkupString解析HTML

修正资源文件后,代码可简化为:

<p class="note">@((MarkupString)Localizer["Test"].Value(2))</p>

推荐用Localizer自带的Value方法传格式化参数,比手动调用String.Format更简洁。

三、解决HtmlSanitizer找不到的问题

若需对HTML做安全过滤(防止XSS),先安装对应NuGet包:

  1. 用.NET CLI执行安装命令:
dotnet add package HtmlSanitizer

也可在Visual Studio的NuGet包管理器中搜索HtmlSanitizer安装。

  1. 使用示例:
@using Ganss.Xss

@{
    var sanitizer = new HtmlSanitizer();
    var rawHtml = Localizer["Test"].Value(2);
    var sanitizedHtml = sanitizer.Sanitize(rawHtml);
}

<p class="note">@((MarkupString)sanitizedHtml)</p>

额外处理方案(针对无法修改资源文件的情况)

如果资源文件必须保留双重转义,可手动反转义后再转MarkupString:

@{
    var escapedText = Localizer["Test"].Value;
    var rawHtml = System.Web.HttpUtility.HtmlDecode(escapedText);
    var formattedHtml = string.Format(rawHtml, 2);
}

<p class="note">@((MarkupString)formattedHtml)</p>

不过优先修正资源文件的存储方式更稳妥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:15:25