关于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

posted @ 2013-03-28 23:22  大悟飞天  阅读(475)  评论(0编辑  收藏  举报