如何让Html.DisplayFor显示换行符?

时间:2012-01-27 08:42:55

标签: asp.net-mvc-3 razor

令人尴尬的新手问题:

我的模型中有一个包含换行符的string字段。

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

不显示换行符。

显然,我可以在模型中做一些摆弄并创建另一个用\n取代<br/>的字段,但这看起来很糟糕。什么是教科书使这项工作的方式?

8 个答案:

答案 0 :(得分:76)

一个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)

答案 1 :(得分:52)

我建议使用css格式化输出,而不是使用cpu消耗服务器端字符串操作,如.replace,

只需添加此样式属性即可呈现多行文字:

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

然后

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

换行符将呈现为 br 元素,在此处进行测试http://refork.com/xaf4

答案 2 :(得分:44)

在您看来,您可以尝试类似

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

答案 3 :(得分: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)

答案 4 :(得分:3)

您可以为数据创建显示模板。 这是一篇详细介绍如何操作的文章。 How do I create a MVC Razor template for DisplayFor()

在该模板中,您可以将换行符实际转换为其他任何需要进行演示的工作。

答案 5 :(得分:2)

尝试使用
@Html.Raw("<p>" + Html.LabelFor(x => x.Name) + "</p>")

答案 6 :(得分:1)

这是另一种扩展方法选项。

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

答案 7 :(得分:0)

DisplayTemplates for common DataTypes的启发, 我为DataType.MultilineText/Views/Shared/DisplayTemplates/Multiline.cshtml覆盖(引入了?)默认的DisplayTemplate,其中仅包含以下行:

<span style="white-space: pre-wrap">@this.Model</span>

当然,如果愿意,您还可以引入一个CSS类,或在视图内部替换换行符。
(我猜这个模板是自动解析的,因为我不需要UIHint或任何其他参考或注册。)

使用DisplayTemplate而不是引入HtmlHelper方法的优点是,它可以细化到未明确定义的属性和视图(例如,DisplayFor(MyClassWithMultilineProperties)现在也可以正确显示{{1} },如果只有属性用MyClassWithMultilineProperties.MultilineText注释。