我有一个接受输入的textarea控件。我试图稍后通过简单地使用将文本渲染到视图:
@ model。CommentText
这是对任何值的正确编码。但是,我想用<br />替换换行字符,我找不到一种方法来确保新的br标记不会被编码。我已经尝试使用HtmlString,但还没有任何运气。
我有一个接受输入的textarea控件。我试图稍后通过简单地使用将文本渲染到视图:
@ model。CommentText
这是对任何值的正确编码。但是,我想用<br />替换换行字符,我找不到一种方法来确保新的br标记不会被编码。我已经尝试使用HtmlString,但还没有任何运气。
当前回答
Omar作为HTML Helper的第三个解决方案是:
public static IHtmlString FormatNewLines(this HtmlHelper helper, string input)
{
return helper.Raw(helper.Encode(input).Replace("\n", "<br />"));
}
其他回答
试试下面的方法:
@MvcHtmlString.Create(Model.CommentText.Replace(Environment.NewLine, "<br />"))
更新:
根据马辛德对这一相关问题的评论,ASP。NET MVC团队希望为Razor视图引擎实现类似于<%:和<%=的东西。
更新2:
我们可以把任何关于HTML编码的问题都转化为关于有害用户输入的讨论,但这样的讨论已经够多了。
不管怎样,要注意潜在的有害用户输入。
@MvcHtmlString.Create(Html.Encode(Model.CommentText).Replace(Environment.NewLine, "<br />"))
更新3 (Asp。Net MVC 3):
@Html.Raw(Html.Encode(Model.CommentText).Replace("\n", "<br />"))
在换行符上拆分(环境不确定)并定期打印—无需担心编码或xss:
@if (!string.IsNullOrWhiteSpace(text))
{
var lines = text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
<p>@line</p>
}
}
(删除空条目是可选的)
Omar作为HTML Helper的第三个解决方案是:
public static IHtmlString FormatNewLines(this HtmlHelper helper, string input)
{
return helper.Raw(helper.Encode(input).Replace("\n", "<br />"));
}
使用CSS的空白属性,而不是打开自己的XSS漏洞!
<span style="white-space: pre-line">@Model.CommentText</span>
我更喜欢这种方法,因为它不需要手动发出标记。我使用这个是因为我将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;
}