У меня есть textarea
в mvc. Когда данные вводятся в это, и я показываю его обратно пользователю, как мне показать разрывы строк?
Я показываю следующее:
<%= Model.Description%>
У меня есть textarea
в mvc. Когда данные вводятся в это, и я показываю его обратно пользователю, как мне показать разрывы строк?
Я показываю следующее:
<%= Model.Description%>
Следующий класс реализует HtmlHelper, который правильно кодирует текст:
public static class HtmlExtensions
{
public static MvcHtmlString Nl2Br(this HtmlHelper htmlHelper, string text)
{
if (string.IsNullOrEmpty(text))
return MvcHtmlString.Create(text);
else
{
StringBuilder builder = new StringBuilder();
string[] lines = text.Split('\n');
for (int i = 0; i < lines.Length; i++)
{
if (i > 0)
builder.Append("<br/>\n");
builder.Append(HttpUtility.HtmlEncode(lines[i]));
}
return MvcHtmlString.Create(builder.ToString());
}
}
}
Он прост в использовании в ваших представлениях:
<%= Html.Nl2Br(Model.MultilineText) %>
Или с помощью Razor:
@Html.Nl2Br(Model.MultilineText)
Для немного другого (и, IMHO, лучшего и безопасного) способа решения проблемы см. этот ответ на аналогичный вопрос.
В принципе, вместо того, чтобы решить проблему преобразования всех новых строковых символов в элементы <br>
, это так же просто, как применить следующий CSS к элементу, в котором вы показываете введенный текст:
white-space: pre-line
Вы должны всегда кодировать введенный пользователем текст при отображении его обратно в представлении, чтобы убедиться в его безопасности.
Вы могли бы сделать, как предложил Cybernate, или добавить его в метод расширения HtmlHelper
public static string EncodedMultiLineText(this HtmlHelper helper, string text) {
if (String.IsNullOrEmpty(text)) {
return String.Empty;
}
return Regex.Replace(helper.Encode(text), Environment.NewLine, "<br/>")
}
Чтобы его можно было легко использовать повторно, просмотрите
<%= Html.EncodedMultiLineText(Model.Description) %>
Попробуйте что-то вроде этого:
<%=
Regex.Replace(
Html.Encode(Model.Description),
Environment.NewLine,
"<br/>",
RegexOptions.IgnoreCase||RegexOptions.Multiline
)
%>
Ответ выше, который предоставляет статическое HTML-вспомогательное расширение, предоставляет устаревший конструктор:
return new MvcHtmlString(builder.ToString());
Эта строка может быть заменена следующей строкой кода:
return MvcHtmlString.Create((builder.ToString()));
Я думаю, что этот ответ решает проблемы красиво, просто используя css: style="white-space: pre-line"
также проверьте: Свойство белого белого CSS.
Мне нравится использовать HtmlExtensions, Environment.NewLine и Regex, которые были в разных ответах, поэтому я как бы поставил вышеуказанные ответы в один метод.
public static MvcHtmlString MultiLineText(this HtmlHelper htmlHelper, string text) {
if (string.IsNullOrEmpty(text)) {
return MvcHtmlString.Create(string.Empty);
}
return MvcHtmlString.Create(Regex.Replace(HttpUtility.HtmlEncode(text), Environment.NewLine, "<br/>"));
}
Использование
<%= Html.MultiLineText(Model.MultilineText) %>
или
@Html.MultiLineText(Model.MultilineText)
Может быть, это ответ: Как вы обрабатываете разрывы строк в просмотре HTML Encoded MVC?
или
вы можете попробовать:
Model.Description.Replace(Environment.NewLine, "<br/>");
Это работает для меня -
<% = HttpUtility.HtmlDecode(Html.ActionLink( "AOT < br/" > Claim # "," actionName"))% >
Для Asp.net mvc razor я использовал Html.Encode для блокировки атак xss
@Html.Raw(Html.Encode(Model.Description).Replace(Environment.NewLine, "<br />"))
Не похоже, что вы пытаетесь кодировать HTML, поэтому регулярная замена должна работать нормально.
<%= Model.Description.Replace(Environment.NewLine, "<br />")%>