【问题标题】:asp.net mvc convert \n new line to html breaksasp.net mvc 将 \n 新行转换为 html 中断
【发布时间】:2011-06-29 06:15:03
【问题描述】:

我在 mvc 中有一个 textarea。当输入数据并将其显示给用户时,如何显示换行符?

我是这样显示的:

<%= Model.Description%>

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-2


【解决方案1】:

以下类实现了一个正确编码文本的 HtmlHelper:

public static class HtmlExtensions
{
    public static MvcHtmlString Nl2Br(this HtmlHelper htmlHelper, string text)
    {
        if (string.IsNullOrEmpty(text))
            return MvcHtmlString.Create(text);
        else
        {
            StringBuilder builder = new StringBuilder();
            string[] lines = text.Split('\n');
            for (int i = 0; i < lines.Length; i++)
            {
                if (i > 0)
                    builder.Append("<br/>\n");
                builder.Append(HttpUtility.HtmlEncode(lines[i]));
            }
            return MvcHtmlString.Create(builder.ToString());
        }
    }
}

在您的视图中很容易使用:

<%= Html.Nl2Br(Model.MultilineText) %>

或者使用 Razor:

@Html.Nl2Br(Model.MultilineText)

【讨论】:

  • 谢谢!正是我想要的!
  • 这个 HtmlExensions 业务正是我想要的。但是,为什么不把整个身体换成return MvcHtmlString.Create(HttpUtility.HtmlEncode(text).Replace("\n", "&lt;br /&gt;"));呢?
  • 我会让自己编辑您的答案以添加文本空引用检查
  • 如果可以保留 \n 并添加 br ,为什么用 br 替换 \n 它会更容易在 view:source 中阅读,所以基本上选择 \n br 或 br \n最终结果超过了 br
  • 请显示所有导入/包含,因为 MvcHtmlString 默认不存在。
【解决方案2】:

有关解决问题的稍微不同(恕我直言,更好更安全)的方法,请参阅this answer to a similar question

基本上,无需将所有换行符转换为&lt;br&gt; 元素,只需将以下 CSS 应用于显示输入文本的元素即可:

white-space: pre-line

【讨论】:

  • 我可能是唯一遇到此问题的白痴,但为了节省下一个人的时间:如果您这样做,请确保删除 div 中所有无关的换行符。
  • 这不适用于所有邮件客户端。 @Codo的使用解决方案
【解决方案3】:

在视图中显示用户输入的文本时,您应该始终对其进行编码,以确保其安全。

您可以按照 Cyber​​nate 的建议进行操作,也可以将其添加到 HtmlHelper 扩展方法中

public static string EncodedMultiLineText(this HtmlHelper helper, string text) {
  if (String.IsNullOrEmpty(text)) {
    return String.Empty;
  }
  return Regex.Replace(helper.Encode(text), Environment.NewLine, "<br/>")
}

这样它可以在您的视图中轻松重复使用

<%= Html.EncodedMultiLineText(Model.Description) %>

【讨论】:

  • 很抱歉鼓励在我的评论中进行编码,然后在我自己的代码中将其遗漏。失败。
【解决方案4】:

试试这样的:

<%=
Regex.Replace(
              Html.Encode(Model.Description), 
              Environment.NewLine, 
              "<br/>", 
              RegexOptions.IgnoreCase||RegexOptions.Multiline
             )
%>

【讨论】:

  • 为什么这个得票最多?它是最有效还是最安全的?
  • 它可能有一些优势,因为它是最古老的。
  • 你不应该在这里使用Regex.Replace
【解决方案5】:

对于 Asp.net mvc razor,我使用 Html.Encode 来阻止 xss 攻击

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

【讨论】:

    【解决方案6】:

    上面提供静态 HTML 帮助程序扩展的答案提供了一个过时的构造函数:

    return new MvcHtmlString(builder.ToString());
    

    这行代码可以替换成下面这行代码:

    return MvcHtmlString.Create((builder.ToString()));
    

    【讨论】:

    • 发现该示例的另一个问题。它在空输入上中断。可以通过在方法的第一行插入以下代码来修复: if(text == null) return MvcHtmlString.Create(text);
    • 非常感谢。我从来不知道它会坏。
    • 感谢您的支持。我现在可以添加 cmets 而不必发布这些愚蠢的片段作为答案。
    【解决方案7】:

    我认为answer 以一种很好的方式解决了问题,只需使用 css:style="white-space: pre-line" 也检查:CSS white space property

    【讨论】:

      【解决方案8】:

      也许这就是答案:How do you handle line breaks in HTML Encoded MVC view?

      你可以试试:

      Model.Description.Replace(Environment.NewLine, "<br/>");
      

      【讨论】:

      • 输出用户输入的未经编码的文本是非常危险的。即使原始问题中没有使用编码,也应鼓励编码。
      【解决方案9】:

      我喜欢使用 HtmlExtensions、Environment.NewLine 和 Regex,它们在不同的答案中,所以我有点将上述答案放在一个方法中。

      public static MvcHtmlString MultiLineText(this HtmlHelper htmlHelper, string text) {
       if (string.IsNullOrEmpty(text)) {
           return MvcHtmlString.Create(string.Empty);
       }
       return MvcHtmlString.Create(Regex.Replace(HttpUtility.HtmlEncode(text), Environment.NewLine, "<br/>"));
      }
      

      使用

      <%= Html.MultiLineText(Model.MultilineText) %>
      

      或者

      @Html.MultiLineText(Model.MultilineText)
      

      【讨论】:

        【解决方案10】:

        这对我有用 -

        Claim #", "actionName" ))%>

        【讨论】:

          【解决方案11】:

          您似乎没有尝试进行 HTML 编码,因此常规替换应该可以正常工作。

          <%= Model.Description.Replace(Environment.NewLine, "<br />")%>
          

          【讨论】:

          • 输出用户输入的未经编码的文本是非常危险的。即使原始问题中没有使用编码,也应鼓励编码。
          • 大部分情况下你是对的。我假设这不是问题,因为 OP 一开始就没有编码。 OP 从未指定它是管理面板还是匿名用户输入。如果它是某种只有管理员访问权限的 CMS 系统(可能是少数情况),您就不想对其进行编码。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-22
          • 2023-02-02
          • 2021-08-27
          相关资源
          最近更新 更多