Как сделать Html.DisplayFor отображения разрывов строк?
Смущающий вопрос новичков:
В моей модели есть поле string
, содержащее разрывы строк.
@Html.DisplayFor(x => x.MultiLineText)
не отображает разрывы строк.
Очевидно, я мог бы сыграть в модели и создать другое поле, которое заменяет \n
на <br/>
, но это похоже на kludgy. Какой способ учебника сделать эту работу?
Ответы
Ответ 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);
}