zoukankan      html  css  js  c++  java
  • Request.QueryString与一般NameValueCollection的区别

      最近在做一个搜索程序的优化改进,将搜索结果按照查询的参数不同进行缓存。缓存的Key很自然的就想到了用查询字符串,而获取查询字符串的最简单方式是通过Request.QueryString.ToString()方法。查看了QueryString的定义类型是NameValueCollection,就误以为这是NameValueCollection的重写了ToString()的方法,于是放心地将代码转移到了业务逻辑层。因为还要重构查询参数,因此重新构建了一个NameValueCollection,并想当然地用ToString()的结果作为Key。但实际运行之后发现,每次的结果都一样的,都是第一次的查询结果。经调试,发现NameValueCollection的ToString()方法并没有重新,还是返回的是“System.Collections.Specialized.NameValueCollection”。

      先看看调试时的情况,发现QueryString的实际类型是System.Web.HttpValueCollection,该类型继承自NameObjectCollectionBase,跟NameValueCollection的基类是一样的。那么最有可能的就是QueryString直接继承了NameValueCollection,并且重写了ToString()的方法。

    普通NameValueCollection的表现如下

    根据以上判断基本为什么QueryString表面上看起来是NameValueCollection但又实际上表现出不同的ToString表现。

      接下来继续了解一下System.Web.HttpValueCollection是何方神圣。该类用起来似乎很方便,也尝试在代码中使用,但提示找不到类。在MSDN中也没有明确该类的记录,可以基本判定为私有的类型或者受保护的。搜索之后发现,该类是的完整定义是System.Web.HttpValueCollection, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,只能通过反射的方式访问或修改该类型。因此想用这个类的话,基本上是比较麻烦,不太值得。但是在一般开发者眼中,都希望查询字符串的和NameValueCollection能很顺畅的进行呼唤,通过ToString()的简单方式就能获得。目前要实现两者的转换有以下方式

    从查询字符串内容转换到NameValueCollection

    HttpUtility.ParseQueryString(querystring);(参考http://msdn.microsoft.com/zh-cn/library/ms150046(v=VS.90).aspx),这种方式得到的就是正品QueryString,ToString()后为所实际的值。

    从NameValueCollection转化的为查询字符串

    只能遍历NameValueCollection,然后自个拼出一个查询字符串了

    View Code
    1             foreach (string key in c.Keys)
    2              {
    3                  sb.AppendFormat("{0}={1}", key, c[key]);    
    4              }

     但实际上我们希望有更自然的方式,因为往往我们跟乐于操作可读写的NameValueCollection,而不是只读的QueryString。

    老外对此也提出了意见,具体可参考

    http://msmvps.com/blogs/paulomorgado/archive/2008/07/15/make-the-httpvaluecollection-class-public-and-move-it-to-system-dll.aspx

  • 相关阅读:
    [BZOJ 2186][Sdoi2008]沙拉公主的困惑(欧拉函数)
    [BZOJ1271][WC2008]秦腾与教学评估(巧妙的二分)
    [BZOJ2879][Noi2012]美食节(最小费用最大流动态加边)
    [BZOJ1070][SCOI2007]修车(最小费用最大流)
    [BZOJ1211][HNOI2004]树的计数(Prufer序列)
    [BZOJ1406][AHOI2007]密码箱(数论)
    1、体验
    sublime 安装插件
    <a>标签中的href="javascript:;"就是去掉a标签的默认行为
    html 中的media属性
  • 原文地址:https://www.cnblogs.com/shenba/p/2281340.html
Copyright © 2011-2022 走看看