asp.net mvc конвертирует \ n новую строку в разрывы html - PullRequest
27 голосов
/ 17 февраля 2011

У меня есть textarea в MVC.Когда данные вводятся в это, и я отображаю их обратно пользователю, как мне показать разрывы строк?

Я отображаю так:

<%= Model.Description%>

Ответы [ 11 ]

50 голосов
/ 17 февраля 2011

Следующий класс реализует 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) %>

Или бритвой:

@Html.Nl2Br(Model.MultilineText)
18 голосов
/ 04 декабря 2013

Для немного другого (и, ИМХО, лучшего и более безопасного) способа решения проблемы см. этот ответ на аналогичный вопрос .

В принципе, вместо того, чтобы преодолевать трудностипреобразовать все символы новой строки в <br> элементы, это так же просто, как применить следующий CSS к элементу, где вы показываете введенный текст:

white-space: pre-line
9 голосов
/ 17 февраля 2011

Вы должны всегда кодировать введенный пользователем текст при отображении его обратно в виде, чтобы убедиться, что он безопасен.

Вы можете сделать так, как предложил 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) %>
6 голосов
/ 17 февраля 2011

Попробуйте что-то вроде этого:

<%=
Regex.Replace(
              Html.Encode(Model.Description), 
              Environment.NewLine, 
              "<br/>", 
              RegexOptions.IgnoreCase||RegexOptions.Multiline
             )
%>
5 голосов
/ 11 мая 2011

Ответ выше, который предоставляет статическое вспомогательное расширение HTML, предоставляет устаревший конструктор:

return new MvcHtmlString(builder.ToString());

Эту строку можно заменить следующей строкой кода:

return MvcHtmlString.Create((builder.ToString()));
3 голосов
/ 06 ноября 2014

Я думаю, что ответ решает проблемы хорошим способом, просто используя css: style="white-space: pre-line" проверьте также: Свойство пробела CSS .

1 голос
/ 12 апреля 2013

Для Asp.net mvc бритвы я использовал Html.Encode для блокировки xss атак

@Html.Raw(Html.Encode(Model.Description).Replace(Environment.NewLine, "<br />"))
1 голос
/ 13 февраля 2012

Мне нравится использовать 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)
0 голосов
/ 10 октября 2011

Это работает для меня -

<% = HttpUtility.HtmlDecode (Html.ActionLink ("AOTClaim # "," actionName "))%>

0 голосов
/ 17 февраля 2011

Не похоже, что вы пытаетесь кодировать HTML, поэтому обычная замена должна работать нормально.

<%= Model.Description.Replace(Environment.NewLine, "<br />")%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...