我有一个文本框控件可以接受输入。我尝试使用以下代码在视图中呈现该文本:
@Model.CommentText
这段代码正确地对所有值进行编码。但是,我想用<br />
替换换行符,并且我找不到方法来确保新的br标签不会被编码。 我尝试使用HtmlString但是还没有成功。
我有一个文本框控件可以接受输入。我尝试使用以下代码在视图中呈现该文本:
@Model.CommentText
这段代码正确地对所有值进行编码。但是,我想用<br />
替换换行符,并且我找不到方法来确保新的br标签不会被编码。 我尝试使用HtmlString但是还没有成功。
使用CSS white-space 属性替代自己暴露于 XSS 漏洞之下!
<span style="white-space: pre-line">@Model.CommentText</span>
pre-line
属性的良好解释(我之前只知道 nowrap
和 pre
)。 - James Skemp尝试以下方法:
@MvcHtmlString.Create(Model.CommentText.Replace(Environment.NewLine, "<br />"))
根据 这个相关问题 上的 marcind
评论,ASP.NET MVC 团队正试图实现类似于 Razor 视图引擎的 <%:
和 <%=
。
我们可以把关于 HTML 编码的任何问题都变成有害用户输入的讨论,但已经有足够多的内容了。
无论如何,请注意潜在的有害用户输入。
@MvcHtmlString.Create(Html.Encode(Model.CommentText).Replace(Environment.NewLine, "<br />"))
@Html.Raw(Html.Encode(Model.CommentText).Replace("\n", "<br />"))
<script>
发表评论怎么办。 - Darin Dimitrov\n
而不是\r\n
。 - Buildstarted按照换行符分割(与环境无关),并定期输出 -- 无需担心编码或 XSS 攻击:
@if (!string.IsNullOrWhiteSpace(text))
{
var lines = text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
<p>@line</p>
}
}
(删除空条目是可选的)
Omar作为HTML助手的第三个解决方案是:
public static IHtmlString FormatNewLines(this HtmlHelper helper, string input)
{
return helper.Raw(helper.Encode(input).Replace("\n", "<br />"));
}
using System.Web.Mvc;
using System.Text.RegularExpressions;
namespace System.Web.Mvc.Html {
public static class MyHtmlHelpers {
public static MvcHtmlString EncodedReplace(this HtmlHelper helper, string input, string pattern, string replacement) {
return new MvcHtmlString(Regex.Replace(helper.Encode(input), pattern, replacement));
}
}
}
使用方法(带有改进的正则表达式):
@Html.EncodedReplace(Model.CommentText, "[\n\r]+", "<br />")
我对Jacob的解决方案有所担忧,因为使用CSS渲染换行符会破坏HTML语义。
我需要将一些文本分成段落(“p”标签),因此我使用了一些之前答案中的建议创建了一个简单的辅助程序(谢谢大家)。
public static MvcHtmlString ToParagraphs(this HtmlHelper html, string value)
{
value = html.Encode(value).Replace("\r", String.Empty);
var arr = value.Split('\n').Where(a => a.Trim() != string.Empty);
var htmlStr = "<p>" + String.Join("</p><p>", arr) + "</p>";
return MvcHtmlString.Create(htmlStr);
}
使用方法:
@Html.ToParagraphs(Model.Comments)
我更喜欢这种方法,因为它不需要手动发出标记。我使用它是因为我将Razor Pages呈现为字符串并通过电子邮件发送它们,这是一个白空间样式不总起作用的环境。
public static IHtmlContent RenderNewlines<TModel>(this IHtmlHelper<TModel> html, string content)
{
if (string.IsNullOrEmpty(content) || html is null)
{
return null;
}
TagBuilder brTag = new TagBuilder("br");
IHtmlContent br = brTag.RenderSelfClosingTag();
HtmlContentBuilder htmlContent = new HtmlContentBuilder();
// JAS: On the off chance a browser is using LF instead of CRLF we strip out CR before splitting on LF.
string lfContent = content.Replace("\r", string.Empty, StringComparison.InvariantCulture);
string[] lines = lfContent.Split('\n', StringSplitOptions.None);
foreach(string line in lines)
{
_ = htmlContent.Append(line);
_ = htmlContent.AppendHtml(br);
}
return htmlContent;
}
\n
的形式存储,您想要将其转换为<br />
吗? - Marko