Blazor中强制转换为MarkupString仍出现HTML字符串编码问题
Blazor中MarkupString未按预期渲染HTML的问题
问题复现
- 编写Blazor组件代码如下:
<small class="help-text editable-label" @ref="HelpText"> @(!string.IsNullOrWhiteSpace(Model.HelpText) ? (MarkupString)Model.HelpText : "Double-click here to add text") </small>
- 测试时给
Model.HelpText字段赋值为:
"<b><i>This is a test</b></i>"
- 实际运行效果:页面直接展示包含HTML标签的原始字符串,没有渲染出预期的加粗斜体格式。
故障原因
C#三元表达式要求两个分支的返回类型可以隐式统一,当前代码中一个分支返回MarkupString类型,另一个分支返回普通string类型,编译器会自动将两个分支的返回值统一隐式转换为string类型,等于之前对Model.HelpText的MarkupString强转失效。Blazor对普通字符串会默认做HTML编码处理,最终就会把HTML标签作为纯文本展示。
修复方案
将三元表达式的两个分支都显式转换为MarkupString类型,保证表达式最终返回值是MarkupString,Blazor就会按原生HTML渲染内容,修正后代码如下:
<small class="help-text editable-label" @ref="HelpText"> @(!string.IsNullOrWhiteSpace(Model.HelpText) ? (MarkupString)Model.HelpText : (MarkupString)"Double-click here to add text") </small>
注意:
MarkupString会跳过Blazor的HTML编码逻辑,如果渲染的内容来自用户输入,必须先做XSS风险过滤,避免恶意脚本注入。
内容的提问来源于stack exchange,提问作者Rob Simmermon
相关产品推荐
相关产品推荐

