在 ASP.NET Razor 视图中,直接向 StringBuilder 追加 并输出到 @str 会导致 HTML 被自动 HTML 编码而显示为纯文本;需使用 @Html.Raw() 或结合 标签配合换行符实现安全、正确的换行渲染。
在 asp.net 中,直接向 `stringbuilder` 追加 `
` 并输出到 `@str` 会导致 html 被自动 html 编码而显示为纯文本;需使用 `@html.raw()` 或结合 `
` 标签配合换行符实现安全、正确的换行渲染。</p><p>在 ASP.NET Razor 视图中处理代码文本的换行时,一个常见误区是认为 <br> 字符串只要拼入字符串就能被浏览器解析为换行——实际上,Razor 默认会对 @ 表达式输出的内容进行 HTML 编码(即 <br> 会被转义为 <br>),导致页面仅显示文字 <br>,而非实际换行。</p><h3>✅ 正确做法:使用 @Html.Raw() 解码 HTML</h3><p>将你原逻辑稍作调整,关键在于<strong>显式告知 Razor:该字符串已包含可信 HTML,无需编码</strong>:</p><pre class="brush:php;toolbar:false;">@if (!string.IsNullOrEmpty(code))
{
var str = new StringBuilder();
foreach (var c in code)
{
str.Append(c);
if (c == ';')
{
str.Append("<br>");
}
}
<p style="text-align:justify;">@Html.Raw(str.ToString())</p>
}
⚠️ 注意:@Html.Raw() 仅适用于完全可控、无用户输入风险的场景(如本例中 code 来自可信服务端且已做语法清洗)。若 code 可能含用户提交内容,直接 Raw 存在 XSS 风险,应优先考虑下文更安全的
+ \n 方案。</p></blockquote><h3>✅ 更安全推荐:用 <pre class="brush:php;toolbar:false;"> + \n 替代 <br></h3><p>HTML 的 <pre class="brush:php;toolbar:false;"> 元素天然保留空白符与换行符,配合 Environment.NewLine 或 \n 即可实现语义清晰、安全可靠的换行:</p><div class="aritcle_card flexRow"> <div class="artcardd flexRow"> <a class="aritcle_card_img" href="/ai/1694" title="INFINITE ALBUM"><img src="https://img.php.cn/upload/ai_manual/000/000/000/175680309477082.jpg" alt="INFINITE ALBUM" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a href="/ai/1694" title="INFINITE ALBUM">INFINITE ALBUM</a> <p>面向游戏玩家的生成式AI音乐</p> </div> <a href="/ai/1694" title="INFINITE ALBUM" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</p><pre class="brush:php;toolbar:false;">@if (!string.IsNullOrEmpty(code)) { var str = new StringBuilder(); foreach (var c in code) { str.Append(c); if (c == ';') { str.AppendLine(); // 等价于 Append("\n") } } <pre class="brush:php;toolbar:false;" style="text-align:justify; font-family: 'Consolas', 'Courier New', monospace; white-space: pre-wrap; margin: 0;"> @str}
- white-space: pre-wrap 确保换行符生效且内容可自动折行(避免长行溢出);
- font-family 使用等宽字体,提升代码可读性;
- @str 在
内无需 Html.Raw() —— 因为 \n 是普通字符,由 <pre class="brush:php;toolbar:false;"> 渲染为换行,不涉及 HTML 标签,零 XSS 风险。? 补充说明:为什么 str.AppendLine() 在 Razor 中“看似无效”?
StringBuilder.AppendLine() 确实插入了 \n,但普通 HTML 元素(如
)会忽略连续空白符和换行符。只有
、<code> 或配合 CSS white-space: pre/pre-wrap 才能使其生效。因此,<strong>换行符能否显示,取决于容器元素的渲染行为,而非字符串本身是否含 \n</strong>。<h3>✅ 总结建议</h3> <table> <thead><tr> <th>场景</th> <th>推荐方案</th> <th>安全性</th> <th>适用性</th> </tr></thead> <tbody> <tr> <td>代码块渲染(推荐)</td> <td><pre class="brush:php;toolbar:false;"> + \n + white-space: pre-wrap✅ 高(无 HTML 注入风险) ✔️ 通用、语义清晰、样式可控 快速原型/完全可信数据 @Html.Raw() +
⚠️ 低(需严格过滤) ❗ 仅限内部工具、无外部输入 复杂格式需求 结合 System.Web.HttpUtility.HtmlEncode() 预处理后 Html.Raw() ✅ 可控 ?️ 需额外编码逻辑 始终优先选择语义化、安全、可维护的方案——对代码文本,请拥抱
,而非手动注入 <br>。










