关于Request.QueryString参数的重构
注:尊重他人原创,转载请务必注明来自http://www.cnblogs.com/Raoh/archive/2013/03/28/NameValueCollection_HttpValueCollection.html
在某些情况下,我们需要对Request.QueryString中的参数进行重构,并借此重新生成一个新的QueryString字符串,因此,我们需要对Request.QueryString进行了解一下。
查看.Net源码中,会看到其类型定义如下:
public virtual NameValueCollection QueryString { get; }
由于Request.QueryString是一个只读属性,我们无法直接对其进行修改后直接使用。
当然,你完全可以自己实现一个方法去获取Request.QueryString的值,并重新生成一个新的QueryString字符串,但是,我们今天只谈如何直接利用NameValueCollection对象来重新生成我们需要的QueryString字符串。
首先,我们在代码中显式的定义一个NameValueCollection,并从Request.QueryString取值,然后为其加上两对参数,代码如下:
NameValueCollection nvc = new NameValueCollection(Request.QueryString); nvc.Add("RAM","2G"); nvc.Add("RAM","4G");
Console.WriteLine(nvc.ToString());
假设此时我们请求的URL是:http://www.mysite.com?categoryId=10&pageNum=1&pageSize=50,
我们希望得到的输出是这样的:"categoryId=10&pageNum=1&pageSize=50&RAM=2G&RAM=4G"。
然而,最终的输出却会吓你一跳,输出内容竟然是:"System.Collections.Specialized.NameValueCollection"。
这是怎么回事?
Debug一下,你会发现,Request.QueryString在运行时,实际类型却是System.Web.HttpValueCollection。(Request.QueryString.ToString()使用的正是该类的ToString()方法)
那么,我们就定义一个System.Web.HttpValueCollection呗,敲下这段代码会发现,提示你找不到该类,反汇编System.web.dll查看一下,我们会看到如下内容:
原来这是一个继承自NameValueCollection的私有类。
其实,我们可以通过HttpUtility.ParseQueryString(string query)来返回一个可读写的NameValueCollection类型对象,这个方法实际上返回的正是HttpValueCollection实例,还是上面那个示例,我们修改代码如下:
NameValueCollection nvc = HttpUtility.ParseQueryString(Request.QueryString.ToString()); nvc.Add("RAM","2G"); nvc.Add("RAM","4G");
Console.WriteLine(nvc.ToString());
假设此时我们请求的URL还是:http://www.mysite.com?categoryId=10&pageNum=1&pageSize=50,
我们得到的输出就是:"categoryId=10&pageNum=1&pageSize=50&RAM=2G&RAM=4G"。
注:文中若有不当之处,请给予指正,谢谢!
尊重他人原创,转载请务必注明来自http://www.cnblogs.com/Raoh/archive/2013/03/28/NameValueCollection_HttpValueCollection.html