在写程序的时候,我们经常需要对页面进行传参数,比如page?id=1234,那么在page这个页面中就直接可以使用string id = 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吧!

private string ResultDataSign(string postData)

{

//string echostr = Var.SYS_OAUTH_VERIFY_CODE;

NameValueCollection nameValue = GetQueryString(postData);

StringBuilder builder = new StringBuilder();

if (nameValue != null)

{

int count = 0;

String[] sortedKeys = nameValue.AllKeys;

Array.Sort(sortedKeys);

foreach (String key in sortedKeys)

{

count++;

builder.Append(key + "=" + nameValue[key]);

if (count != nameValue.Count)

{

builder.Append("&");

}

}

}

return md5(builder.ToString()).ToLower();

}

private string md5(String input)

{

MD5CryptoServiceProvider Md5 = new MD5CryptoServiceProvider();

return BitConverter.ToString(Md5.ComputeHash(Encoding.UTF8.GetBytes(input))).Replace("-", "");

}

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);

}

用到System.web的命名空间

C#获取URL参数值(NameValueCollection)的更多相关文章

  1. C#获取URL参数值

    原文:C#获取URL参数值 在写程序的时候,我们经常需要对页面进行传参数,比如page?id=1234,那么在page这个页面中就直接可以使用string id = Request.QueryStri ...

  2. js获取url参数值(HTML之间传值)

    <h3>未设置设备: <a href="javascript:addTab('设备列表','PKE_DeviceContent/PKE_DeviceContent.aspx ...

  3. 替换所有字符串,获取url参数值

    替换所有的字符串: var newStr = str.replace(/null/g, ""); 获取url参数值 <script type="text/javas ...

  4. js获取url参数值的两种方式

    js获取url参数值的方法有很多,下面也为大家介绍两种.  方法一:正则分析法  function getQueryString(name) {  var reg = new RegExp(" ...

  5. js获取url参数值的几种方式

    一.原生js获取URL参数值: 比如当前URL为:http://localhost:8080/#/page2?id=100&name=guanxy <template> <d ...

  6. C# 解析获取Url参数值

    今天遇到一个需求,需要处理通过接口传过来的一个参数,参数内容为一个拼接好的Url地址,且该地址还会携带了一些额外的参数,包括但不限于数字,字符串,json串.样例如下: http://www.cple ...

  7. js获取url参数值,js获取其他页面传递而来的值

    index.htm?参数1=数值1&参数2=数值2&参数3=数据3&参数4=数值4&...... 静态html文件js读取url参数 根据获取html的参数值控制htm ...

  8. js获取url参数值的方法

    index.htm?参数1=数值1&参数2=数值2&参数3=数据3&参数4=数值4&...... 静态html文件js读取url参数 根据获取html的参数值控制htm ...

  9. 获取url参数值(可解码中文值)

    /** * 根据指定参数名称获取参数值 * @param {String} urlStr 参数名称 * @return {Object} 参数值 * */ getUrlParams = functio ...

随机推荐

  1. Swift中NSData与NSDictionary之间的相互转换

    原创Blog,转载请注明出处 使用NSKeyedUnarchiver类来进行相互转换 1.NSDictionary转NSData var dictionaryExample : [String:Any ...

  2. SVG 和字符图标

    制作网站往往需要使用一些图标来提高用户体验,如果我们的是一些扁平化设计的图标,我们可以选择 SVG 或 图标字体来提高用户体验. 下面对这两种技术进行比较. 开发难度: 现在的在线工具非常强大,比如  ...

  3. CSS的base文件常用代码

    article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body,but ...

  4. SqlLikeAttribute 特性增加 左、右Like实现

    SqlLikeAttribute 特性原来只实现了全Like,今天增加左.右Like实现 更新时间:2016-04-30 /// <summary> /// 获取查询条件语句 /// &l ...

  5. android:padding和android:margin的区别

    Android的Margin和Padding跟Html的是一样的.如下图所示:黄色部分为Padding,灰色部分为Margin. 通俗的理解: Padding 为内边框,指该控件内部内容,如文本/图片 ...

  6. java 包之 BeanUtils包的使用

    BeanUtils工具包是由Apache公司所开发,主要是方便程序员对Bean类能够进行简便的操作. 在使用BeanUtils工具包之前我们需要的Jar包有以下几种: (1)   BeanUtils相 ...

  7. C++程序设计实践指导1.4正整数转换为字符串改写要求实现

    改写要求1:改为适合处理超长整数 #include <cstdlib> #include <iostream> #include <string> using na ...

  8. 表单验证的validate.js插件---jQuery Validation Plugin

    早上在公交车上看了一个关于慕课网的教程<表单验证的validate.js插件---jQuery Validation Plugin>,正好可以用到自己近期开发简易微博的注册页面和登录页面, ...

  9. AngularJS 中的 Promise 和 设计模式

    解决 Javascript 异步事件的传统方式是回调函数:调用一个方法,然后给它一个函数引用,当这个方法完结的时候执行这个函数引用. <!-- lang: js --> $.get('ap ...

  10. 重读LPTHW-Lesson37

    这次是复习课  复习python符号  整理如下 1.逻辑运算符not.and.or python中逻辑运算符包括not(布尔非).and(布尔与).or(布尔或).注意以下几点: ①运算规则: 例: ...