ASP.NET MVC Html.Encode – 新行

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

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

我认为有2种选择,但也许有人会提出更好的第三种选择。

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

另一种选择是在我的样式表中混淆white-space: pre属性 – 但是我不确定当Html帮助方法包含新行和Tab键以使页面源非常漂亮时是否会产生副作用。

是否有第三个选项,如全局标志,事件或方法覆盖,我可以用来改变html编码的方式而不必重做html帮助器方法?

HtmlEncode仅用于编码以HTML格式显示的字符。 它特别不编码空白字符。

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

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

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

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

如果您使用剃刀,您可以:

 @MvcHtmlString.Create(Html.Encode(strToEncode).Replace(Environment.NewLine, "
"))

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

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

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

将输出放在


和/或块中。 例如:

 
@someValue

/ @someValue


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

 
@someValue

取决于您是否需要语义标记或是否想要使用css。 我认为这些都比插入标签更整洁。

  ///  /// Returns html string with new lines as br tags ///  public static MvcHtmlString ConvertNewLinesToBr(this HtmlHelper html, string text) { return new MvcHtmlString(html.Encode(text).Replace(Environment.NewLine, "
")); }