ASP.NET MVC文本区域HTML帮助程序在使用AntiXsLibrary时添加行



我注意到ASP中有一个最烦人(可能)的错误。NET MVC的TextAreaFor HTML帮助程序。出于某种原因,HTML助手在文本区域中的任何内容之前都添加了一个NewLine。显然,这是为了解决个人内容故意从新行开始,而浏览器根据规范忽略它的可能问题。

然而,通过添加它,我得到了一个更令人讨厌的错误,现在在我的所有文本区域中,表单加载上的任何内容之前都会自动增加一行(即,这显示在我的字段中的任何内容前面: ; ;)。在吐出"换行符"之前,似乎有什么东西在对其进行编码。

有人能解决这个问题吗?我预计它的预期行为是打印

    <textarea>
    Stuff</textarea>

而不是

    <textarea>&#13;&#10;Stuff</textarea>

我得到了。。。

编辑经过进一步检查,这似乎是由于我使用AntiXssLibrary进行编码,而不是默认的HtmlEncoder。我使用的是4.0版本,我的编码器类方法如下所示:

    protected override void HtmlEncode(string value, TextWriter output)
    {
        output.Write(Microsoft.Security.Application.Encoder.HtmlEncode(value));
    }

因此,我的想法是,由于TagBuilder类是从TextAreaHelper调用的,HTML对标记的内容进行编码,它假设了默认HTML编码器的行为,但AntiXsLibrary更彻底,因此您看到了这种行为吗?

经过一些代码挖掘,我发现我的想法是正确的。MVC3 TextArea HTML Helper使用TagBuilder类,并执行以下操作:

tagBuilder.SetInnerText(Environment.NewLine + value);

由于SetInnerText调用HttpUtility。对传递给它的参数的内容进行编码,这将导致不仅在实际VALUE上,而且在该Environment上调用默认编码器。NewLine,这意味着如果你不使用默认的HtmlEncoder(比如AntiXssLibrary),可能会有一些意外的行为,比如这样。

解决办法是他们改为调用:

tagBuilder.InnerHtml = Environment.NewLine + HttpUtility.Encode(value);

我已经提交了一份错误报告。

与此同时,我正在实现一个Javascript onLoad修复程序,以从所有文本区域删除有问题的编码:

$("textarea").each(function () { $(this).val($(this).val().trim()); });

最新更新