如何使Html.DisplayFor显示换行符?
尴尬的新手问题:
我的模型中包含换行符的string
字段。
@Html.DisplayFor(x => x.MultiLineText)
不显示换行符。
很明显,我可以在模型中做一些摆弄,并创造另一个取代\n
领域,但看起来很烂。 什么是教科书的方式来使这项工作?
使用换行符显示string值的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)
我build议使用css格式化输出,而不是使用CPU消耗服务器端string操作像.replace,
只需添加这个样式属性来渲染多行文本:
.multiline { white-space: pre-wrap; }
然后
<div class="multiline"> my multiline text </div>
换行符将呈现像br元素,请在http://refork.com/xaf4上进行testing
在你看来,你可以尝试类似的东西
@Html.Raw(Html.Encode(Model.MultiLineText).Replace("\n", "<br />"))
显示模板可能是最好的解决scheme,但是如果你知道你只是显示一个string,还有另外一个简单的方法来使用html helper,例如:
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)
您为您的数据创build一个显示模板。 这里有一篇文章,详细介绍如何做到这一点。 如何为DisplayFor()创build一个MVC Razor模板
在那个模板中,你可以将新行的实际转换成
以及其他需要做的工作。
尝试使用
@Html.Raw("<p>" + Html.LabelFor(x => x.Name) + "</p>")
这是另一个扩展方法选项。
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); }