为什么我的MarkupString无法正确渲染?
Razor条件渲染HTML未正常解析问题
我编写了一行带条件判断的Razor代码:
<BSCol MD="3" Class="d-flex justify-content-center"><b>@(_bid.PriceGuarantee ? "Price Is Guaranteed" : ((MarkupString)"<div class='text-danger'>Price Is NOT Guaranteed</div>"))</b></BSCol>
但渲染结果不符合预期:未保证价格的文本没有显示为红色,反而直接输出了<div class='text-danger'>Price Is NOT Guaranteed</div>这段HTML代码,而非解析后的样式化文本。
问题原因
- HTML嵌套规范冲突:
<b>是行内元素,按照HTML规范不能包含块级元素<div>,浏览器会自动修正这种错误嵌套,导致代码解析异常。 - Razor表达式解析问题:原代码中
MarkupString嵌套在行内元素内部,表达式的嵌套结构导致Razor没有正确解析HTML内容,直接输出了源码。
解决方案
方案一:使用if-else分支替代三元表达式(更清晰易维护)
<BSCol MD="3" Class="d-flex justify-content-center"> @if (_bid.PriceGuarantee) { <b>Price Is Guaranteed</b> } else { <b><span class='text-danger'>Price Is NOT Guaranteed</span></b> } </BSCol>
用行内元素<span>替代<div>,避免行内元素嵌套块级元素的问题,同时代码逻辑更直观。
方案二:调整三元表达式,确保MarkupString内容合规
<BSCol MD="3" Class="d-flex justify-content-center"> @(_bid.PriceGuarantee ? (MarkupString)"<b>Price Is Guaranteed</b>" : (MarkupString)"<b><span class='text-danger'>Price Is NOT Guaranteed</span></b>") </BSCol>
将<b>标签整合到MarkupString中,同时用<span>替换<div>,保证HTML嵌套符合规范,Razor能正确解析并渲染样式。
内容的提问来源于stack exchange,提问作者Paul T. Rykiel
相关产品推荐
相关产品推荐

