ASP.NET MVC Html.Encode - Новые строки - PullRequest
24 голосов
/ 07 февраля 2009

Html.Encode, кажется, просто вызывает HttpUtility.HtmlEncode, чтобы заменить несколько специфических символов html их escape-последовательностями.

Однако это не учитывает, как будут интерпретироваться новые строки и несколько пробелов (пробел разметки). Поэтому я предоставляю пользователю текстовую область для ввода простого текстового блока, а затем позже отображаю эти данные на другом экране (используя Html.Encode), новые строки и интервалы не сохраняются.

Я думаю, что есть 2 варианта, но, может быть, есть и третий вариант, который кто-то может предложить.

Один из вариантов - написать статический метод, использующий HtmlEncode, а затем заменить новые строки в результирующей строке на <br>, а группы из нескольких пробелов - &nbsp;

Другим вариантом было бы возиться с атрибутом white-space: pre в моих таблицах стилей - однако я не уверен, будут ли это вызывать побочные эффекты, когда вспомогательные методы Html включают новые строки и табуляции для придания привлекательности исходному тексту страницы.

Есть ли третий вариант, такой как глобальный флаг, переопределение события или метода, который я могу использовать, чтобы изменить способ кодирования html без необходимости повторного использования вспомогательных методов html?

Ответы [ 5 ]

23 голосов
/ 07 февраля 2009

HtmlEncode предназначен только для кодирования символов для отображения в HTML. Он специально не кодирует пробельные символы.

Я бы выбрал ваш первый вариант и сделал его методом расширения для HtmlHelper. Что-то вроде:

public static string HtmlEncode(this HtmlHelper htmlHelper,
                                string text, 
                                bool preserveWhitespace)
{
    // ...
}

Вы можете использовать String.Replace() для кодирования новых строк и пробелов (или Regex.Replace, если вам нужно лучшее соответствие).

8 голосов
/ 17 января 2012

Использование style="white-space:pre-wrap;" сработало для меня. За эту статью .

5 голосов
/ 25 августа 2012

Если вы используете Razor, вы можете сделать:

@MvcHtmlString.Create(Html.Encode(strToEncode).Replace(Environment.NewLine, "<br />"))

по вашему мнению или в вашем контроллере:

HttpServerUtility httpUtil = new HttpServerUtility();
MvcHtmlString encoded = httpUtil.HtmlEncode(strToEncode).Replace(Environment.NewLine, "<br />");

Я не проверял метод контроллера, но он должен работать так же.

3 голосов
/ 16 февраля 2011

Поместите вывод в блоки и / или <code>. Например:

<code><pre>@someValue
/ @someValue

Использовать эквивалентную CSS для существующего div:

<div style="white-space:pre-wrap;">@someValue</div>

Зависит от того, хотите ли вы семантической разметки или хотите возиться с css. Я думаю, что они оба аккуратнее, чем вставка тегов <br/>.

0 голосов
/ 18 августа 2014
    /// <summary>
    /// Returns html string with new lines as br tags
    /// </summary>
    public static MvcHtmlString ConvertNewLinesToBr<TModel>(this HtmlHelper<TModel> html, string text)
    {
        return  new MvcHtmlString(html.Encode(text).Replace(Environment.NewLine, "<br />"));
    }
...