使用 AntiXssEncoder 时,输入 "placeholder" 属性在 IE 中不再起作用

Input "placeholder" attribute no longer working in IE when using AntiXssEncoder

当输入为空且取消选择时,我无法在输入元素上看到 placeholder 值。输入元素:

<input id="OldPassword" runat="server" type="password" class="form-control" name="password_old" placeholder="Old password" tabindex="1" autocomplete="off" required />
<input id="NewPassword" runat="server" type="password" class="form-control" name="password" placeholder="New password" tabindex="2" autocomplete="off" required />
<input id="NewPasswordRepeat" runat="server" type="password" class="form-control" name="password_confirm" placeholder="Repeat new password" tabindex="3" autocomplete="off" required />

当我刚刚将项目从 .NET4.0 升级到 .NET 4.5.1 并且我向 httpRuntime 添加了一个 encoderType 时出现了这个问题:

<httpRuntime targetFramework="4.5.1" 
             requestValidationMode="4.5" 
             enableVersionHeader="false"
             encoderType="System.Web.Security.AntiXss.AntiXssEncoder,System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

删除 AntiXss encoderType 属性时,输入再次显示其占位符:

我只在使用 Internet Explorer 时遇到此问题,Chrome 和 FireFox 似乎工作正常。我正在使用 Internet Explorer v11.0.9600.17728,因此支持占位符属性,否则在使用 AntiXssEncoder.

是什么导致了这个问题?

此问题是由 X-UA-Compatible 的元标记引起的,其中包含早期 IE 版本呈现的多个内容值:

<meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7; IE=EDGE" />

此标签的内容由 AntiXssEncoder 编码为

<meta http-equiv="X-UA-Compatible" content="IE=9;&#32;IE=8;&#32;IE=7;&#32;IE=EDGE" />

Internet Explorer 似乎无法使用元标记内容中的 HTML 代码并在 之后立即删除该值IE=9,导致页面以 IE9 的兼容模式呈现。在 IE10 中添加了对占位符属性的支持,这就是为什么在为 IE9 呈现文档后它们不显示的原因。

我通过删除元标记中的空格解决了这个问题:

<meta http-equiv="X-UA-Compatible" content="IE=9;IE=8;IE=7;IE=EDGE" />