【问题标题】:ASP.NET MVC: How do I display multiline text?ASP.NET MVC:如何显示多行文本?
【发布时间】:2016-08-03 02:01:49
【问题描述】:

查看模型:

public class Note
{
    [DataType(DataType.MultilineText)]
    public string Text { get; set; }
}

默认编辑器模板呈现一个 <textarea> 元素并保留换行符。

默认显示模板将文本呈现为单个字符串,并删除了换行符。

我试过了,但是没用:

~/Views/Shared/EditorTemplates/MultilineText.cshtml

@model string

@Html.Raw(Model.Replace(System.Environment.NewLine, "<br />"))

我可以做一些像@Html.Raw(Model.Replace("e", "&lt;br /&gt;")) 这样的傻事,它会起作用,但当然我只想用&lt;br /&gt; 元素替换换行符!我也尝试过使用@"\n",但也没有用。

有什么想法吗?

谢谢!

【问题讨论】:

  • 当然@"\n" 不起作用,您需要使用"\n" @ 强制将字符串解析为文字。
  • 这对我来说是个彻头彻尾的错误。

标签: c# asp.net-mvc razor


【解决方案1】:

答案是你什么都不会做。这就是您的样式表的工作。基本上,以您想要的任何方式呈现内容,例如,将内容呈现为&lt;p&gt;,并使用 CSS 来控制保留空白的方式。例如:

(在您的样式标签或 CSS 中)

p.poem {
   white-space:pre;
}

(在您的 HTML 标记中)

<p class="poem">
    There is a place where the sidewalk ends
    And before the street begins,
    And there the grass grows soft and white,
    And there the sun burns crimson bright,
    And there the moon-bird rests from his flight
    To cool in the peppermint wind.
</p>

【讨论】:

  • 我什至没有在我的帖子中提到控制器。我不确定我明白你在说什么。我在视图模型中使用属性来提供有关原始类型属性(多行文本、货币等)的元数据。元数据由自定义剃须刀模板使用,如我的示例所示。
  • 相应编辑。不要在 ViewModel 中放置
     或实际样式,而是在视图中渲染出一个类,描述正在渲染的对象 ,而不是如何格式化。
  • 你真的认为有一个单独的类来表示货币,而不是使用小数并使用属性来指定小数属性货币更好吗?在我的示例中,该属性指定字符串 is 是一个注释。 cshtml 模板描述了如何 格式化这样的属性。我不是想争论,但实际上很好奇。谢谢!
  • 确实——你在哪里划清界限?我可以看到尝试使用 CSS 和货币格式的东西,但货币是不同的,因为您正在根据文化更改文本内容。在您的情况下,我将 CSS 类称为“note”,这将使您可以灵活地更改注释的颜色或字体,而无需更改标记。如果您愿意,您还可以使用 jQuery 轻松控制笔记的行为。此外,CSS 中的空白有更多的选择,而不仅仅是直接的“pre”。您可能希望实际使用“预包装”或其中一个选项。
  • 我认为这比使用@Html.Row更好。
【解决方案2】:

你可以试试这个:

@Html.Raw("<pre>"+ Html.Encode(Model) + "</pre>");

这将保留您的内容并按原样显示。

【讨论】:

  • 还记得用Html.Encode(string)对模型值进行html编码
  • @stringValue - 已经进行了 HTML 编码(在 ASP.NET MVC 4 中测试)。额外做这件事有什么意义?
  • @PhilippMunin 也许如果你检查了答案的日期,很明显当时 asp.net mvc 4 不可用:)
  • 另外,如果你想保留你的空间,你可以添加.Replace(" ", "&amp;nbsp;")。像这样@Html.Raw("&lt;pre&gt;"+ Html.Encode(Model).Replace(" ", "&amp;nbsp;") + "&lt;/pre&gt;");
【解决方案3】:

我建议使用 css 格式化输出,而不是使用像 .replace 这样的服务器端字符串操作,

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

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

然后

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

newlines 将像 br 元素一样呈现。

【讨论】:

    【解决方案4】:

    试试@Html.Raw(Model.Replace("\r\n", "&lt;br /&gt;"))

    【讨论】:

      【解决方案5】:
      <pre>@myMultiLineString</pre>
      

      <span style="white-space:pre">@myMultiLineString</span>
      

      不需要做 Html.Encode,因为它是默认完成的

      【讨论】:

        【解决方案6】:
         [DataType(DataType.MultilineText)]
        public your_property {set; get;}
        

        如果您使用EditorFor(),它将起作用

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-01
          • 1970-01-01
          • 2014-07-21
          • 2016-08-05
          • 2018-09-21
          • 1970-01-01
          相关资源
          最近更新 更多