Подтвердить что ты не робот

Asp.net mvc convert\n новая строка в html breaks

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

Я показываю следующее:

<%= Model.Description%>
4b9b3361

Ответ 1

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

Ответ 2

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

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

white-space: pre-line

Ответ 3

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

Вы могли бы сделать, как предложил 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) %>

Ответ 4

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

<%=
Regex.Replace(
              Html.Encode(Model.Description), 
              Environment.NewLine, 
              "<br/>", 
              RegexOptions.IgnoreCase||RegexOptions.Multiline
             )
%>

Ответ 5

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

return new MvcHtmlString(builder.ToString());

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

return MvcHtmlString.Create((builder.ToString()));

Ответ 7

Мне нравится использовать 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)

Ответ 9

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

<% = HttpUtility.HtmlDecode(Html.ActionLink( "AOT < br/" > Claim # "," actionName"))% >

Ответ 10

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

@Html.Raw(Html.Encode(Model.Description).Replace(Environment.NewLine, "<br />"))

Ответ 11

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

<%= Model.Description.Replace(Environment.NewLine, "<br />")%>