Заменить символы разрыва строки на in ASP.NET вид бритвы MVC

У меня есть элемент управления textarea, который принимает ввод. Я пытаюсь позже отобразить этот текст в представление, просто используя:

@Model.CommentText

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

6 ответов


использовать CSS свойство пробела вместо того, чтобы открывать себя до уязвимостей XSS!

<span style="white-space: pre-line">@Model.CommentText</span>

попробуйте следующее:

@MvcHtmlString.Create(Model.CommentText.Replace(Environment.NewLine, "<br />"))

обновление:

по данным marcind's комментировать этот вопрос, ASP.NET команда MVC хочет реализовать что-то похожее на <%: и <%= для двигателя вида бритвы.

обновление 2:

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

в любом случае, позаботьтесь о потенциальном вреде пользовательский ввод.

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

обновление 3 (Asp.Net MVC 3):

@Html.Raw(Html.Encode(Model.CommentText).Replace("\n", "<br />"))

разделить на новые строки (агностик среды) и печатать регулярно -- не нужно беспокоиться о кодировке или xss:

@if (!string.IsNullOrWhiteSpace(text)) 
{
    var lines = text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
    foreach (var line in lines)
    {
        <p>@line</p>
    }
}

(удалить пустые записи необязательно)


третье решение Omar в качестве помощника HTML будет:

public static IHtmlString FormatNewLines(this HtmlHelper helper, string input)
{
    return helper.Raw(helper.Encode(input).Replace("\n", "<br />"));
}

применение сухой принцип для решения Omar, вот расширение HTML Helper:

using System.Web.Mvc;
using System.Text.RegularExpressions;

namespace System.Web.Mvc.Html {
    public static class MyHtmlHelpers {
        public static MvcHtmlString EncodedReplace(this HtmlHelper helper, string input, string pattern, string replacement) {
            return new MvcHtmlString(Regex.Replace(helper.Encode(input), pattern, replacement));
        }
    }
}

использование (с улучшенным регулярным выражением):

@Html.EncodedReplace(Model.CommentText, "[\n\r]+", "<br />")

Это также имеет дополнительное преимущество в том, что меньше нагрузки на разработчика Razor View для обеспечения безопасности от уязвимостей XSS.


моя озабоченность решением Джейкоба заключается в том, что рендеринг разрывов строк с помощью CSS ломает HTML семантика.


мне нужно было разбить текст на абзацы (теги" p"), поэтому я создал простой помощник, используя некоторые рекомендации в предыдущих ответах (спасибо, ребята).

public static MvcHtmlString ToParagraphs(this HtmlHelper html, string value) 
    { 
        value = html.Encode(value).Replace("\r", String.Empty);
        var arr = value.Split('\n').Where(a => a.Trim() != string.Empty);
        var htmlStr = "<p>" + String.Join("</p><p>", arr) + "</p>";
        return MvcHtmlString.Create(htmlStr);
    }

использование:

@Html.ToParagraphs(Model.Comments)