HTML.Encode, но сохранить разрывы строк - PullRequest
36 голосов
/ 06 апреля 2011

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

В моем представлении (Razor) я хочу сделать что-то вроде этого ...

@Message.Replace("\n", "</br>")

Это не работает, потому что Razor Html кодирует по умолчанию.Это здорово, но я хочу, чтобы мои разрывы строк.

Если я сделаю это, я столкнусь с проблемами XSS.

@Html.Raw(Message.Replace("\n", "</br>"))

Как правильно справиться с этой ситуацией?

Ответы [ 5 ]

45 голосов
/ 06 апреля 2011

Используйте HttpUtility.HtmlEncode, затем сделайте замену.

@Html.Raw(HttpUtility.HtmlEncode(Message).Replace("\n", "<br/>"))
13 голосов
/ 31 мая 2013

Если вы обнаружите, что используете это более одного раза, может быть полезно обернуть его в пользовательский HtmlHelper, например так:

namespace Helpers
{
    public static class ExtensionMethods
    {
        public static IHtmlString PreserveNewLines(this HtmlHelper htmlHelper, string message)
        {
            return message == null ? null : htmlHelper.Raw(htmlHelper.Encode(message).Replace("\n", "<br/>"));
        }
    }
}

После этого вы сможете использовать свой собственный HtmlHelper следующим образом:

@Html.PreserveNewLines(Message)

Имейте в виду, что вам нужно добавить использование в ваше пространство имен помощников, чтобы HtmlHelper был доступен.

9 голосов
/ 06 апреля 2011

Вы можете закодировать ваше сообщение, а затем отобразить его в сыром видеЧто-то вроде:

@Html.Raw(Server.HtmlEncode(Message).Replace("\n", "<br/>"))
1 голос
/ 28 октября 2016

Для тех, кто использует AntiXssEncoder.HtmlEncode

Поскольку AntiXssEncoder.HtmlEncode кодирует символ / r / n в &#13;&#10;, поэтому оператор должен быть

_mDraftMsgModel.wnItem.Description = AntiXssEncoder.HtmlEncode(draftModel.txtMsgContent, false).Replace("&#13;&#10;", "<br/>");
0 голосов
/ 20 июня 2018

В моем случае моя строка содержала HTML, который я хотел закодировать, но я также хотел, чтобы разрывы строк HTML оставались на месте. Код ниже превращает разрывы строк HTML в \ n, а затем кодирует все. Затем все экземпляры \ n возвращаются в разрывы строк HTML:

@Html.Raw(HttpUtility.HtmlEncode(message.Replace("<br/>", "\n").Replace("<br />", "\n")).Replace("\n", "<br/>"))
...