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

ASP.NET MVC Html.Encode - новые строки

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

в вашем представлении или в вашем контроллере:

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

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

Ответ 4

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

<pre>@someValue</pre> / <code>@someValue</code>

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

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

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

Ответ 5

    /// <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 />"));
    }