2009-02-07 3 views
23

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

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

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

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

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

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

ответ

23

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

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

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

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

2

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

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

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

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

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

5

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

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

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

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

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

+0

Контрольная часть не компилируется. – 1kevgriff

+0

Не компилируется.должен быть: MvcHtmlString encoded = MvcHtmlString (HttpContext.Current.Server.HtmlEncode (Body) .Replace (Environment.NewLine, "
")); – AntonK

+0

«Тип« System.Web.HttpServerUtility »не имеет определенных конструкторов» использовать HttpUtility.HtmlEncode – Benoit

0
/// <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 />")); 
    } 
Смежные вопросы