Замените символы перерыва линии с
в Asp.net MVC Razor View
-
26-09-2019 - |
Вопрос
У меня есть контроль текстовой области, который принимает вход. Я пытаюсь позже сделать этот текст на вид, просто используя:
@ Model.commenteText.
Это правильно кодирует какие-либо значения. Тем не менее, я хочу заменить символы разбития линии с <br />
И я не могу найти способ убедиться, что новые теги BR не кодируются. Я пытался использовать HTMLString, но еще не повезло.
Решение
Использовать CSS White-Space Property Вместо того, чтобы открыть себя до уязвимостей 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 />"))
Третье решение Омара как HTML-помощник будет:
public static IHtmlString FormatNewLines(this HtmlHelper helper, string input)
{
return helper.Raw(helper.Encode(input).Replace("\n", "<br />"));
}
Разделить на Newlines (окружающая среда Agnostic) и регулярно печатайте - не нужно беспокоиться о кодировке или XSS:
@if (!string.IsNullOrWhiteSpace(text))
{
var lines = text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
<p>@line</p>
}
}
(Удалить пустые записи необязательно)
Применение Сухой принцип Для решения Омара вот расширение 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 />")
Это также имеет дополнительное преимущество в размере меньшего размещения на разрабатывателя по виду бритвы, чтобы обеспечить безопасность от уязвимостей 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)