为何Request.QueryString.Get()与NameValueCollection.Get()返回解码后的值?
为什么调用NameValueCollection.Get()会返回解码后的参数值?
这其实是ASP.NET内部使用的HttpValueCollection(它是NameValueCollection的子类,负责处理查询字符串、表单数据的实际逻辑)的设计特性导致的,咱们来捋清楚背后的原因:
调试器显示的是底层原始存储值
当ASP.NET解析请求的查询字符串时,会把编码后的原始键值对直接存在集合的底层存储结构里。调试器悬停查看集合时,读取的就是这个未处理的原始编码内容,所以你会看到{param=omitted3GCDqHrqg5w%2b6NJfc%3d}这种编码状态的字符串。.Get()方法内置了自动解码逻辑
HttpValueCollection重写了NameValueCollection的.Get()方法,在返回参数值前会自动执行URL解码操作:它会把URL编码的特殊字符(比如%2b还原为+,%3d还原为=)转换回原始字符。这个设计是为了让开发者直接拿到可以使用的业务数据,不用自己手动处理解码的繁琐细节。这种设计的合理性
底层保留编码后的原始值,是为了在需要重新生成查询字符串(比如页面重定向、拼接URL)时,能准确还原最初的参数状态;而对外暴露的.Get()方法自动解码,则是为了简化开发流程,避免重复实现URL解码的逻辑。
内容的提问来源于stack exchange,提问作者Hunter Nelson
相关产品推荐
相关产品推荐

