在 ASP.NET Razor 视图中,直接向 StringBuilder 追加 <br> 并输出到 @str 会导致 HTML 被自动 HTML 编码而显示为纯文本;需使用 @Html.Raw() 或结合 <pre> 标签配合换行符实现安全、正确的换行渲染。
在 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 风险,应优先考虑下文更安全的 <pre> + \n 方案。
✅ 更安全推荐:用 <pre> + \n 替代 <br>
HTML 的 <pre> 元素天然保留空白符与换行符,配合 Environment.NewLine 或 \n 即可实现语义清晰、安全可靠的换行:
立即学习“前端免费学习笔记(深入)”;
@if (!string.IsNullOrEmpty(code))
{
var str = new StringBuilder();
foreach (var c in code)
{
str.Append(c);
if (c == ';')
{
str.AppendLine(); // 等价于 Append("\n")
}
}
<pre style="text-align:justify; font-family: 'Consolas', 'Courier New', monospace; white-space: pre-wrap; margin: 0;">
@str
</pre>
}- white-space: pre-wrap 确保换行符生效且内容可自动折行(避免长行溢出);
- font-family 使用等宽字体,提升代码可读性;
- @str 在 <pre> 内无需 Html.Raw() —— 因为 \n 是普通字符,由 <pre> 渲染为换行,不涉及 HTML 标签,零 XSS 风险。
? 补充说明:为什么 str.AppendLine() 在 Razor 中“看似无效”?
StringBuilder.AppendLine() 确实插入了 \n,但普通 HTML 元素(如 <p>)会忽略连续空白符和换行符。只有 <pre>、<code> 或配合 CSS white-space: pre/pre-wrap 才能使其生效。因此,换行符能否显示,取决于容器元素的渲染行为,而非字符串本身是否含 \n。
✅ 总结建议
| 场景 | 推荐方案 | 安全性 | 适用性 |
|---|---|---|---|
| 代码块渲染(推荐) | <pre> + \n + white-space: pre-wrap | ✅ 高(无 HTML 注入风险) | ✔️ 通用、语义清晰、样式可控 |
| 快速原型/完全可信数据 | @Html.Raw() + <br> | ⚠️ 低(需严格过滤) | ❗ 仅限内部工具、无外部输入 |
| 复杂格式需求 | 结合 System.Web.HttpUtility.HtmlEncode() 预处理后 Html.Raw() | ✅ 可控 | ?️ 需额外编码逻辑 |
始终优先选择语义化、安全、可维护的方案——对代码文本,请拥抱 <pre>,而非手动注入 <br>。



















