我使用HttpUtility.HtmlEncode的简写来编码进入我的文本框的数据。
<asp:TextBox ID="txtProperty" runat="server" Text='<%#: Bind("Property")%>'></asp:TextBox>
我对编码字符行为的理解是,当您的Web浏览器呈现它们时,它们应显示为它们所代表的字符,而不是实际编码的字符。正如MSDN网站上的example code所示。
但是我编码的字符不会这样。
例如,从数据库中检索“£”字符,在文本框中显示为:
而不是:
我认为这与我的网站配置处理编码的方式无关,因为如果我手动将文本设置为HTML中的编码字符:
<asp:TextBox ID="txtProperty" runat="server" Text="£"></asp:TextBox>
它将编码的字符正确呈现为:
这向我表明我使用HtmlEncode的方式存在问题。
我仍尝试在我的webconfig中明确地将编码设置为UTF-8,但没有区别。
有人可以解释这种行为,或者这可能是什么问题?
答案 0 :(得分:3)
当你<%#: Bind("Property")%>
时,ASP.NET已经开始对字符串进行HTML编码,如果你对它进行预编码,你就会陷入双重编码的情况。
参见ScottGu&#39; New <%: %> Syntax for HTML Encoding Output in ASP.NET 4 (and ASP.NET MVC 2):
ASP.NET 4引入了一个新的IHtmlString接口(以及一个具体的实现:HtmlString),您可以在类型上实现它以指示其值已经正确编码(或以其他方式检查)以显示为HTML,因此值不应再次进行HTML编码。
&lt;%:%&gt; code-nugget语法检查是否存在IHtmlString接口,如果其值实现此接口,则不会对代码表达式的输出进行HTML编码。
这允许开发人员避免必须根据具体情况决定是否使用&lt;%=%&gt;或&lt;%:%&gt;代码金块。
相反,您可以随时使用&lt;%:%&gt;代码块,然后让任何已经HTML编码的属性或数据类型实现IHtmlString接口。