Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 如何使Html.DisplayFor显示换行符?_Asp.net Mvc 3_Razor - Fatal编程技术网

Asp.net mvc 3 如何使Html.DisplayFor显示换行符?

Asp.net mvc 3 如何使Html.DisplayFor显示换行符?,asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,令人尴尬的新手问题: 我的模型中有一个字符串字段,其中包含换行符 @Html.DisplayFor(x => x.MultiLineText) 不显示换行符 显然,我可以在模型中做一些修改,并创建另一个字段,将\n替换为,但这似乎很困难。教科书上的方法是什么?尝试使用 @Html.Raw(“”+Html.LabelFor(x=>x.Name)+“”)您可以为数据创建一个显示模板。 这里有一篇文章详细介绍了如何做到这一点。 在该模板中,您可以将换行符实际翻译成以及演示所需的任何其他工作。

令人尴尬的新手问题:

我的模型中有一个
字符串
字段,其中包含换行符

@Html.DisplayFor(x => x.MultiLineText)
不显示换行符

显然,我可以在模型中做一些修改,并创建另一个字段,将
\n
替换为

,但这似乎很困难。教科书上的方法是什么?

尝试使用

@Html.Raw(“”+Html.LabelFor(x=>x.Name)+“

”)

您可以为数据创建一个显示模板。 这里有一篇文章详细介绍了如何做到这一点。


在该模板中,您可以将换行符实际翻译成
以及演示所需的任何其他工作。

在您看来,您可以尝试以下操作

@Html.Raw(Html.Encode(Model.MultiLineText).Replace("\n", "<br />"))
@Html.Raw(Html.Encode(Model.multilitext).Replace(“\n”,“
”)
显示模板可能是最好的解决方案,但如果您知道您只是在显示字符串,则还可以使用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));
        }
    }
}

显示带换行符的字符串值的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);
}

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

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

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


我的
多行
文本

换行符将呈现为br元素,在此处测试它

这里是另一个扩展方法选项

    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);
    }
public static IHtmlString DisplayFormattedFor(此HtmlHelper HtmlHelper,表达式)
{
字符串值=Convert.ToString(modelmetada.FromLambdaExpression(expression,htmlHelper.ViewData.Model);
if(string.IsNullOrWhiteSpace(value))
{
返回MvcHtmlString.Empty;
}
value=string.Join(“
”,value.Split(new[]{Environment.NewLine},StringSplitOptions.None)。选择(HttpUtility.HtmlEncode)); 返回新的HtmlString(值); }
灵感来自:, 我覆盖(引入?)了
数据类型.multilitext
/Views/Shared/DisplayTemplates/Multiline.cshtml的默认显示模板,该模板仅包含以下行:

<span style="white-space: pre-wrap">@this.Model</span>
@this.Model
当然,如果您愿意,也可以引入css类,或者在视图中替换换行符。
(我想这个模板是自动解析的,因为我不需要
UIHint
或任何其他引用或注册。)


使用DisplayTemplate而不是引入
HtmlHelper
-方法的优点是,它会向下延伸到未明确定义的属性和视图(例如
DisplayFor(MyClassWithMultileProperties)
现在也将正确显示
myclasswithmultileProperties.multileText
,前提是仅使用
[DataType(DataType.multileText)]

+1对于模板的想法,但答案归功于@slapthelownote给出的实际实现。在MVC 4中,我在哪里可以定义它?很好,但不是返回
MvcHtmlString.Empty
当值为null或空时,我将调用标准的
HtmlHelper.DisplayFor
方法,以便任何null显示文本可以使用。对于其他可能不知道的新手,使用
DisplayTemplate
而不是引入
HtmlHelper
-方法在“公共静态类HtmlExtensions{}”中定义cwills的DisplayWithBreaksFor()方法,该方法的优点是它会向下延伸到未明确定义的属性和视图(请参阅)。若要对此进行改进,以便仍可使用
Html.DisplayFor
,请应用
[System.ComponentModel.DataAnnotations.DataType(System.ComponentModel.DataAnnotations.DataType.MultilineText)]
属性设置为模型上的
multiliteText
属性,并使用内容创建一个显示模板
@model string@model
,这可能不再重要,但这在IE9上不起作用,至少应为
。替换(“\r\n”,…)
。此外,在我看来,下面的方法要好得多。没有\n就足够了:保留\r\n不会有什么害处,因为它们只是html的空白。虽然匹配\r\n会错过unix样式的换行符,也不会处理它们。不确定这是否是因为我使用的是
ViewData
而不是常规属性,但在ASP.NET Core Razor中,我有若要使用
@Html.Raw(((字符串)ViewData[“MyText”])。请替换(“\n”,“
”)
这是否回答了您的问题?
<div class="multiline">
  my
  multiline
  text
</div>
    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);
    }
<span style="white-space: pre-wrap">@this.Model</span>