ASP.NET MVC в формате HTML.Кодирование - новые линии

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

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

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

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

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

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

5 ответов


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

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

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

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


С помощью style="white-space:pre-wrap;" работал для меня. Пер в этой статье.


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

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

на ваш взгляд, или в вашем контроллере:

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

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


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

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

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

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

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


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