【问题标题】:ASP.NET MVC Html.Encode - New linesASP.NET MVC Html.Encode - 新行
【发布时间】:2010-10-06 04:31:41
【问题描述】:

Html.Encode 似乎只是简单地调用HttpUtility.HtmlEncode 来用它们的转义序列替换一些 html 特定字符。

但是,这并没有考虑如何解释新行和多个空格(标记空白)。所以我提供了一个文本区域供用户输入纯文本信息块,然后在另一个屏幕上显示该数据(使用Html.Encode),新的行和间距将不会被保留。

我认为有 2 个选项,但也许有人可以提出更好的第 3 个选项。

一种选择是只编写一个使用 HtmlEncode 的静态方法,然后用<br> 替换结果字符串中的新行,用  替换多个空格组

另一种选择是在我的样式表中弄乱white-space: pre 属性 - 但是我不确定当 Html 辅助方法包括新行和制表符以使页面源更漂亮时这是否会产生副作用。

是否有第三个选项,例如全局标志、事件或方法覆盖,我可以使用它来更改 html 编码的完成方式,而无需重做 html 辅助方法?

【问题讨论】:

    标签: c# asp.net-mvc newline html-encode


    【解决方案1】:

    HtmlEncode 仅用于对字符进行编码以在 HTML 中显示。它特别不编码空白字符。

    我会选择您的第一个选项,并将其作为 HtmlHelper 的扩展方法。比如:

    public static string HtmlEncode(this HtmlHelper htmlHelper,
                                    string text, 
                                    bool preserveWhitespace)
    {
        // ...
    }
    

    您可以使用String.Replace() 对换行符和空格进行编码(如果您需要更好的匹配,也可以使用Regex.Replace)。

    【讨论】:

      【解决方案2】:

      将您的输出放在<pre></pre> 和/或<code></code> 块中。例如:

      <pre>@someValue</pre> / <code>@someValue</code>
      

      在现有的div 上使用等效的 css:

      <div style="white-space:pre-wrap;">@someValue</div>
      

      取决于您是想要语义标记还是要摆弄 css。我认为这些都比插入&lt;br/&gt; 标签更整洁。

      【讨论】:

        【解决方案3】:

        使用style="white-space:pre-wrap;" 为我工作。根据this article

        【讨论】:

          【解决方案4】:

          如果你使用 Razor,你可以这样做:

          @MvcHtmlString.Create(Html.Encode(strToEncode).Replace(Environment.NewLine, "<br />"))
          

          在您的视图中,或在您的控制器中:

          HttpServerUtility httpUtil = new HttpServerUtility();
          MvcHtmlString encoded = httpUtil.HtmlEncode(strToEncode).Replace(Environment.NewLine, "<br />");
          

          我还没有测试过控制器方法,但它应该以同样的方式工作。

          【讨论】:

          • 控制器部分不会编译。
          • 不编译。应该是: MvcHtmlString 编码 = MvcHtmlString(HttpContext.Current.Server.HtmlEncode(Body).Replace(Environment.NewLine, "
            "));
          • “类型'System.Web.HttpServerUtility'没有定义构造函数”使用HttpUtility.HtmlEncode
          • 改用这个:var httpUtil = new HttpServerUtilityWrapper(HttpContext.Current.Server);
          【解决方案5】:
              /// <summary>
              /// Returns html string with new lines as br tags
              /// </summary>
              public static MvcHtmlString ConvertNewLinesToBr<TModel>(this HtmlHelper<TModel> html, string text)
              {
                  return  new MvcHtmlString(html.Encode(text).Replace(Environment.NewLine, "<br />"));
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-30
            • 1970-01-01
            • 2022-11-29
            • 2011-02-03
            • 1970-01-01
            相关资源
            最近更新 更多