ASP.NET MVC Html.Encode - 新行

24 c# asp.net-mvc newline html-encode

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

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

我认为有两种选择,但也许有人会建议更好.

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

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

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

Bra*_*non 23

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

我会选择你的第一个选项,并使其成为HtmlHelper的扩展方法.就像是:

public static string HtmlEncode(this HtmlHelper htmlHelper,
                                string text, 
                                bool preserveWhitespace)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*lex 8

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


小智 5

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

@MvcHtmlString.Create(Html.Encode(strToEncode).Replace(Environment.NewLine, "<br />"))
Run Code Online (Sandbox Code Playgroud)

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

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

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