ASP.NET 4.0中ListBox与DropDownList的Html编码ListItem显示异常问题
ASP.NET 4.0 ListBox/DropDownList 撇号编码异常问题解决
最近我们团队在维护遗留ASP.NET 4.0应用、做安全更新的时候,碰到了一个挺头疼的控件渲染问题:当我们用经过Html编码的ListItem来填充ListBox或者DropDownList时,如果ListItem的文本里带有撇号('),浏览器完全识别不了控件里的编码内容,最终渲染的时候没法把编码后的文本解码回原本的撇号。
问题复现
比如在Test.aspx的后置代码里,我们会写类似这样的逻辑:
// 先对带撇号的文本做Html编码 var itemText = HttpUtility.HtmlEncode("Mary's Project"); DropDownList1.Items.Add(new ListItem(itemText, "proj-001"));
原本预期页面渲染后会显示Mary's Project,但实际结果却是编码后的Mary's Project——浏览器根本没有把这个实体解码成撇号。
问题原因
这个问题是ASP.NET 4.0的安全更新调整了控件的输出编码规则导致的:更新之后,ListBox和DropDownList这类控件会自动对ListItem的文本进行编码操作,而我们提前手动做的Html编码会被控件再次编码,最终生成的双重编码内容,浏览器就无法识别为可解码的实体了。
解决思路
这里给你几个可行的解决办法:
- 取消手动提前编码:既然控件本身会负责安全编码,那就直接把原始文本传给ListItem,不需要提前做Html编码,让ASP.NET控件自己处理编码逻辑,这样浏览器就能正常解码显示撇号了。
- 解码后再传入控件:如果业务上必须提前编码,可以在添加ListItem前先对编码后的文本做一次Html解码,避免控件二次编码:
var encodedText = HttpUtility.HtmlEncode("Mary's Project"); var originalText = HttpUtility.HtmlDecode(encodedText); DropDownList1.Items.Add(new ListItem(originalText, "proj-001")); - 自定义控件渲染:如果以上方法都不适用,也可以考虑放弃原生控件,用Literal控件手动拼接
<select>和<option>标签,完全掌控编码逻辑,确保文本能正确显示。
内容的提问来源于stack exchange,提问作者David W
相关产品推荐
相关产品推荐

