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

HTML.Encode, но сохраняйте разрывы строк

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Если вы обнаружите, что используете это более одного раза, может быть полезно обернуть его в пользовательский 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)

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

Ответ 3

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

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

Ответ 4

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

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

_mDraftMsgModel.wnItem.Description = AntiXssEncoder.HtmlEncode(draftModel.txtMsgContent, false).Replace("&#13;&#10;", "<br/>");