Заменить символы разрыва строки на in ASP.NET вид бритвы MVC
У меня есть элемент управления textarea, который принимает ввод. Я пытаюсь позже отобразить этот текст в представление, просто используя:
@Model.CommentText
это правильно кодирует любые значения. Тем не менее, я хочу заменить символы разрыва строки на <br />
и я не могу найти способ убедиться, что новые теги br не кодируются. Я пробовал использовать HtmlString, но пока не повезло.
6 ответов
использовать CSS свойство пробела вместо того, чтобы открывать себя до уязвимостей XSS!
<span style="white-space: pre-line">@Model.CommentText</span>
попробуйте следующее:
@MvcHtmlString.Create(Model.CommentText.Replace(Environment.NewLine, "<br />"))
обновление:
по данным marcind's
комментировать этот вопрос, ASP.NET команда MVC хочет реализовать что-то похожее на <%:
и <%=
для двигателя вида бритвы.
обновление 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 будет:
public static IHtmlString FormatNewLines(this HtmlHelper helper, string input)
{
return helper.Raw(helper.Encode(input).Replace("\n", "<br />"));
}
применение сухой принцип для решения Omar, вот расширение HTML Helper:
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 />")
Это также имеет дополнительное преимущество в том, что меньше нагрузки на разработчика Razor View для обеспечения безопасности от уязвимостей XSS.
моя озабоченность решением Джейкоба заключается в том, что рендеринг разрывов строк с помощью 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)