令人尴尬的新手问题:如何使Html.DisplayFor显示换行符?
我有一个string
字段在我的模型中包含换行符。
@Html.DisplayFor(x => x.MultiLineText)
不显示换行符。
很显然,我可以在模型中做一些摆弄,并创建另一个字段,用<br/>
替换\n
,但看起来很烂。教科书的工作方式是什么?
令人尴尬的新手问题:如何使Html.DisplayFor显示换行符?
我有一个string
字段在我的模型中包含换行符。
@Html.DisplayFor(x => x.MultiLineText)
不显示换行符。
很显然,我可以在模型中做一些摆弄,并创建另一个字段,用<br/>
替换\n
,但看起来很烂。教科书的工作方式是什么?
一个扩展的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)
使用
@Html.Raw("<p>" + Html.LabelFor(x => x.Name) + "</p>")
您为您的数据显示模板尝试。 这里有一篇文章详细说明如何做到这一点。 How do I create a MVC Razor template for DisplayFor()
在该模板中,您可以将换行符实际转换为
,以及其他任何需要进行演示的工作。
+1为模板的想法,但回答要归功于由@slapthelownote – 2012-01-27 10:06:52
在你看来,你可以尝试像
@Html.Raw(Html.Encode(Model.MultiLineText).Replace("\n", "<br />"))
给出的实际实施应该至少'.Replace( “\ r \ n”,...)'。另外,在我看来,下面的[来自cwills的解决方案](http://stackoverflow.com/a/10290684/1343917)要好得多。 – 2013-12-31 14:37:42
没有\ n是真的够了:剩余\ r不会伤害,因为它们对于html来说是合理的空格。在\ r \ n上匹配时会错过unix样式的换行符,并且不会处理它们。 – 2014-03-18 14:45:16
最适合我的方式。 +1 – 2015-06-10 12:34:30
显示模板可能是最好的解决方案,但有,如果你知道你只是显示一个字符串使用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)
+1 - 整洁,谢谢! – 2012-01-27 12:51:16
我建议格式化与CSS的输出,而不是使用消耗CPU的服务器端的字符串操作等。更换
只需添加此样式属性来呈现多文本:
.multiline
{
white-space: pre-wrap;
}
然后
<div class="multiline">
my
multiline
text
</div>
换行符将呈现像BR元素,在这里测试http://refork.com/xaf4
为了改进这个,使'Html.DisplayFor'仍然可以应用' [System.ComponentModel.DataAnnotations.DataType(System.ComponentModel.DataAnnotations.DataType.MultilineText)]'属性添加到模型中的'MultiLineText'属性,并创建一个DisplayTemplate,其内容为@model string @Model' – Mike 2013-09-26 13:27:56
我希望我可以upvote两次。 – Winks 2013-10-10 08:55:22
这应该是被接受的答案。 – Charlie 2014-03-01 22:17:43
这里的另一个扩展方法选择。
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);
}
+1只是因为我喜欢有用的扩展方法:) – 2012-04-24 07:28:33
+1:非常干净的方式来实现这个 – chiccodoro 2012-10-31 08:32:24
我可以在MVC 4中定义它吗? – Ofiris 2013-06-04 06:41:32