我注意到ASP中有一个最烦人(可能)的错误。NET MVC的TextAreaFor HTML帮助程序。出于某种原因,HTML助手在文本区域中的任何内容之前都添加了一个NewLine。显然,这是为了解决个人内容故意从新行开始,而浏览器根据规范忽略它的可能问题。
然而,通过添加它,我得到了一个更令人讨厌的错误,现在在我的所有文本区域中,表单加载上的任何内容之前都会自动增加一行(即,这显示在我的字段中的任何内容前面: ; ;)。在吐出"换行符"之前,似乎有什么东西在对其进行编码。
有人能解决这个问题吗?我预计它的预期行为是打印
<textarea>
Stuff</textarea>
而不是
<textarea> 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()); });