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

Как сделать Html.DisplayFor отображения разрывов строк?

Смущающий вопрос новичков:

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

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

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

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

4b9b3361

Ответ 1

Метод расширения 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)

Ответ 2

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

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

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

затем

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

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

Ответ 3

По вашему мнению, вы можете попробовать что-то вроде

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

Ответ 4

Шаблон отображения, вероятно, является лучшим решением, но есть еще один простой способ использования 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)

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

    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);
    }