Замените символы перерыва линии с
в Asp.net MVC Razor View

StackOverflow https://stackoverflow.com/questions/4220381

Вопрос

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

@ Model.commenteText.

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

Это было полезно?

Решение

Использовать CSS White-Space Property Вместо того, чтобы открыть себя до уязвимостей 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 />"))

Третье решение Омара как HTML-помощник будет:

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

Разделить на Newlines (окружающая среда Agnostic) и регулярно печатайте - не нужно беспокоиться о кодировке или XSS:

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

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

Применение Сухой принцип Для решения Омара вот расширение 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 />")

Это также имеет дополнительное преимущество в размере меньшего размещения на разрабатывателя по виду бритвы, чтобы обеспечить безопасность от уязвимостей 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top