C#获取URL参数值
2016-07-24 16:44
549 查看
引用部分
在写程序的时候,我们经常需要对页面进行传参数,比如page?id=1234,那么在page这个页面中就直接可以用stringid = Request.QueryString["id"]; 来获取参数id的值1234了。这是一个人人都知道的基础知识。
上面的方法:Request.QueryString,它会把传入的URL进行分析,并把结果保存在一个键值(key value)的Collection中,我们只要通过设置key值,就可以返回这个key所对应的value了。
假设这个URL不是通过请求进来的,我们是没有办法通过Request来获取URL的参数值的,我们是否可以通过一个字符串string url = "http://www.google.com/page?id=1234"中分析出Collection[key]=value呢?而且很多时候我们的URL的参数都是经过UrlEncode编码的,这个编码通常来说会是Encoding.UTF8或者Encoding.GetEncoding("gb2312"),需要提醒你的是:Baidu的URL是使用gb2312的,而Google是使用UTF8的。那对于传入的字符串我们如何确认是该使用gb2312还是UTF8来解码呢?
在Baidu或者Google搜索到相关的解决办法中,你会看到这样的说法,那就是通过正则表达式去匹配URL,例如:Regex urlRegex = new Regex(@"(?:^|\?|&)courseid=(\d*)(?:&|$)"); 但是我比较怀疑通过这个方法分析出来的数据完整性,它有办法确保匹配出所有数据吗?后来我想到了模拟Microsoft
.NET Framework中Request的方法来解决这个问题。其实上面的string id = Request.QueryString["id"]; 也可以写成 System.Collections.Specialized.NameValueCollection
col = Request.QueryString; string strID = col[”id”];所以让我们来构造这个NameValueCollection吧!
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/// <summary> /// 测试. /// </summary> public void Test() { string pageURL = "http://www.google.com.hk/search?hl=zh-CN&source=hp&q=%E5%8D%9A%E6%B1%87%E6%95%B0%E7%A0%81&aq=f&aqi=g2&aql=&oq=&gs_rfai="; Uri uri = new Uri(pageURL); string queryString = uri.Query; NameValueCollection col = GetQueryString(queryString); str
ing searchKey = col["q"]; //结果 searchKey = "博汇数码" } /// <summary> /// 将查询字符串解析转换为名值集合. /// </summary> /// <param name="queryString"></param> /// <returns></returns> public static NameValueCollection GetQueryString(string queryString) { return GetQueryString(queryString, null, true); } /// <summary> /// 将查询字符串解析转换为名值集合. /// </summary> /// <param name="queryString"></param> /// <param name="encoding"></param> /// <param name="isEncoded"></param> /// <returns></returns> public static NameValueCollection GetQueryString(string queryString, Encoding encoding, bool isEncoded) { queryString = queryString.Replace("?", ""); NameValueCollection result = new NameValueCollection(StringComparer.OrdinalIgnoreCase); if (!string.IsNullOrEmpty(queryString)) { int count = queryString.Length; for (int i = 0; i < count; i++) { int startIndex = i; int index = -1; while (i < count) { char item = queryString[i]; if (item == '=') { if (index < 0) { index = i; } } else if (item == '&') { break; } i++; } string key = null; string value = null; if (index >= 0) { key = queryString.Substring(startIndex, index - startIndex); value = queryString.Substring(index + 1, (i - index) - 1); } else { key = queryString.Substring(startIndex, i - startIndex); } if (isEncoded) { result[MyUrlDeCode(key, encoding)] = MyUrlDeCode(value, encoding); } else { result[key] = value; } if ((i == (count - 1)) && (queryString[i] == '&')) { result[key] = string.Empty; } } } return result; } /// <summary> /// 解码URL. /// </summary> /// <param name="encoding">null为自动选择编码</param> /// <param name="str"></param> /// <returns></returns> public static string MyUrlDeCode(string str, Encoding encoding) { if (encoding == null) { Encoding utf8 = Encoding.UTF8; //首先用utf-8进行解码 string code = HttpUtility.UrlDecode(str.ToUpper(), utf8); //将已经解码的字符再次进行编码. string encode = HttpUtility.UrlEncode(code, utf8).ToUpper(); if (str == encode) encoding = Encoding.UTF8; else encoding = Encoding.GetEncoding("gb2312"); } return HttpUtility.UrlDecode(str, encoding); }
说明
1.对于下面的编码方式中,Baidu是使用gb2312,而Google是使用UTF8的,所以这些编码如何解释呢?解决办法就是如MyUrlDeCode方法所写的,把编码进行一次解码,再把解码后的字符串进行编码,再对字符串进行比较,如果是相同的,那就是使用了这种编码的。还要注意进行ToUpper字符串。
2.string baidu = HttpUtility.UrlDecode("wd=%B2%A9%BB%E3%CA%FD%C2%EB");
string google = HttpUtility.UrlDecode("q=%E5%8D%9A%E6%B1%87%E6%95%B0%E7%A0%81"); 3.关于return GetQueryString(queryString, null, true); 如果你传入的是null,那就是表示你无法确认编码是gb2312还是UTF8,当你确认编码的,可以直接传入编码类型,比如return GetQueryString(queryString, Encoding.UTF8, true);
4.需要注意queryString = queryString.Replace("?", "");把?给过滤掉。
我的说明
我在自己开发中使用了上面大神的代码,利用ajax向后后台传的数据为data: $("form").serialize(),序列化form的数据在后台用上面的代码解析出form里的数据。
好文要顶 关注我 收藏该文
![](http://common.cnblogs.com/images/icon_weibo_24.png)
![](http://common.cnblogs.com/images/wechat.png)
相关文章推荐
- java-用HttpURLConnection发送Http请求.
- c#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- VBScript 剪贴板抓取URL并在浏览器中打开
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法