Как сделать Html.Display для отображения разрывов строк? - PullRequest
48 голосов
/ 27 января 2012

неловко вопрос новичка:

В моей модели есть поле string, которое содержит разрывы строк.

@Html.DisplayFor(x => x.MultiLineText)

не отображает разрывы строк.

Очевидно, я мог бы немного поиграть в модели и создать другое поле, которое заменит \n на <br/>, но это кажется глупым. Как из учебника можно сделать эту работу?

Ответы [ 7 ]

76 голосов
/ 24 апреля 2012

Метод расширения HtmlHelper для отображения строковых значений с переносами строк:

public static MvcHtmlString DisplayWithBreaksFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
    var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
    var model = html.Encode(metadata.Model).Replace("\r\n", "<br />\r\n");

    if (String.IsNullOrEmpty(model))
        return MvcHtmlString.Empty;

    return MvcHtmlString.Create(model);
}

И тогда вы можете использовать следующий синтаксис:

@Html.DisplayWithBreaksFor(m => m.MultiLineField)
53 голосов
/ 24 июня 2013

Я рекомендую форматировать вывод с помощью css, а не использовать процессор, использующий обработку строк на стороне сервера, например .replace,

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

.multiline
{
   white-space: pre-wrap;
}

then

<div class="multiline">
  my
  multiline
  text
</div>

переводы строки будут отображаться как br элементы, протестируйте здесь http://refork.com/xaf4

44 голосов
/ 27 января 2012

На ваш взгляд, вы можете попробовать что-то вроде

@Html.Raw(Html.Encode(Model.MultiLineText).Replace("\n", "<br />"))
4 голосов
/ 27 января 2012

Шаблон отображения, вероятно, является лучшим решением, но есть еще один простой вариант использования помощника html, если вы знаете, что просто отображаете строку, например:

namespace Shaul.Web.Helpers
{
    public static class HtmlHelpers
    {
        public static IHtmlString ReplaceBreaks(this HtmlHelper helper, string str)
        {
            return MvcHtmlString.Create(str.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None).Aggregate((a, b) => a + "<br />" + b));
        }
    }
}

И тогда вы будете использоватьэто как:

@using Shaul.Web.Helpers

@Html.ReplaceBreaks(Model.MultiLineText)
3 голосов
/ 27 января 2012

Вы создаете шаблон отображения для ваших данных. Вот пост, подробно описывающий, как это сделать. Как создать шаблон MVC Razor для DisplayFor ()

В этом шаблоне вы фактически переводите переводы строк на
и все, что нужно сделать для презентации.

2 голосов
/ 27 января 2012

Попробуйте использовать
@Html.Raw("<p>" + Html.LabelFor(x => x.Name) + "</p>")

1 голос
/ 22 сентября 2015

Вот еще одна опция метода расширения.

    public static IHtmlString DisplayFormattedFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, string>> expression)
    {
        string value = Convert.ToString(ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model);

        if (string.IsNullOrWhiteSpace(value))
        {
            return MvcHtmlString.Empty;
        }

        value = string.Join("<br/>", value.Split(new[] { Environment.NewLine }, StringSplitOptions.None).Select(HttpUtility.HtmlEncode));

        return new HtmlString(value);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...