Blazor中MarkupString与String.Format配合使用失效问题
解决Blazor Server中资源文件字符串HTML标签不解析的问题
一、修正资源文件的转义问题
你的App.resx里的HTML标签被双重转义(&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包:
- 用.NET CLI执行安装命令:
dotnet add package HtmlSanitizer
也可在Visual Studio的NuGet包管理器中搜索HtmlSanitizer安装。
- 使用示例:
@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
相关产品推荐
相关产品推荐

