25

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

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

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

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

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

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

4

5 回答 5

23

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

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

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

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

于 2009-02-07T20:46:07.173 回答
8

使用style="white-space:pre-wrap;"为我工作的。根据这篇文章

于 2012-01-17T18:39:13.400 回答
6

如果您使用 Razor,您可以执行以下操作:

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

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

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

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

于 2012-08-24T22:35:41.827 回答
3

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

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

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

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

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

于 2011-02-16T17:15:53.943 回答
0
    /// <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 />"));
    }
于 2014-08-18T15:05:51.580 回答