令人尴尬的新手问题:
我的模型中有一个包含换行符的string
字段。
@Html.DisplayFor(x => x.MultiLineText)
不显示换行符。
显然,我可以在模型中做一些摆弄并创建另一个用\n
取代<br/>
的字段,但这看起来很糟糕。什么是教科书使这项工作的方式?
答案 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
注释。