none
求替换Request中的参数值的方法 RRS feed

  • 问题

  • 比如URL是 default.aspx?id=15&kinds=4&username=%23d%8,现在点了下一个,下一个ID已经获取到,比如是18,跳转代码: Response.Redirect("default.aspx" + Request.Url.Query.ToString());

    除了手动遍历参数再替换的方法,还有什么比较好的方法吗?谢谢指导!

    还有就是删除其中一个参数和值,C#有自带的方法吗?

    2012年10月18日 13:18

全部回复

  • 第一个问题:

    恐怕只有这样做了,因为Request.QueryString是根据url后面的数值获取的,因此你不得不人为变更。

    第二个问题:

    建议使用(比如删除“foo”这个节点):

    ValueCollection params = Request.QueryString; 
    for (int i=0; i<params.Count; i++) 
    { 
        if (params[i].GetKey(i).ToLower() != "foo") 
        { 
            url += string.Concat((i==0 ? "?" : "&"), params[i].GetKey(i), "=", params.Get(i)); 
        } 
    } 
    Response.Redirect(url); 

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年10月19日 1:49
  • 第一个问题:

    恐怕只有这样做了,因为Request.QueryString是根据url后面的数值获取的,因此你不得不人为变更。

    第二个问题:

    建议使用(比如删除“foo”这个节点):

    ValueCollection params = Request.QueryString; 
    for (int i=0; i<params.Count; i++) 
    { 
        if (params[i].GetKey(i).ToLower() != "foo") 
        { 
            url += string.Concat((i==0 ? "?" : "&"), params[i].GetKey(i), "=", params.Get(i)); 
        } 
    } 
    Response.Redirect(url); 

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处


    这个还是手动遍历的方法了,C#有没有自带的方法处理参数的修改或删除的方法?
    2012年10月20日 0:11
    • 已标记为答案 happydaily 2012年10月20日 8:35
    • 取消答案标记 happydaily 2012年10月20日 8:42
    2012年10月20日 1:04
  • 集合是只读的啊?
    2012年10月20日 8:43
  • 集合是只读的啊?

    那只能一个个判断了,NameValueCollection是只读的。


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年10月21日 1:24
  • 不对吧,应该是引用的问题?有Set,Remove,Add,不让用?我自己用正则解决了,但是我还是很好奇这几个方法应该怎么用?
    2012年10月21日 3:32
  • 不对吧,应该是引用的问题?有Set,Remove,Add,不让用?我自己用正则解决了,但是我还是很好奇这几个方法应该怎么用?

    在NameValueCollection中我恐怕是只读的,因此无法使用(Remove无法使用)。

    另外你是怎么解决的?可以黏贴代码吗?谢谢了


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年10月21日 7:44
  • 肯定是能用的,我看来应该是引用类型的问题,如果能把request.querystring赋值给一个新的NameValueCollection应该可以,就不知道怎么赋?难道又是遍历?

     

     /// <summary>
            /// 移除参数列表中指定的键值
            /// </summary>
            /// <param name="参数列表"></param>
            /// <param name="要移除的键名"></param>
            /// <returns></returns>
            public static string RemoveQuery(string query, string key)
            {
                Regex reg = new Regex(@"\?" + key + "=.*?(?=&|$)", RegexOptions.IgnoreCase);
                if (reg.IsMatch(query))//处于首
                {
                    reg = new Regex(key + @"=.*?[&|$]\b", RegexOptions.IgnoreCase);
                    query = reg.Replace(query, "");
                }
                else//处于中间或末尾
                {
                    reg = new Regex("&" + key + ".*?(?=&|$)", RegexOptions.IgnoreCase);
                    query = reg.Replace(query, "");
                }
                return query;
            }
            /// <summary>
            /// 替换参数列表中指定的值
            /// </summary>
            /// <param name="参数列表"></param>
            /// <param name="被替换的键名"></param>
            /// <param name="新的值"></param>
            /// <returns></returns>
            public static string ReplaceQuery(string query, string key, string newvalue)
            {
                Regex reg = new Regex("(?<=" + key + "=).*?(?=&|$)", RegexOptions.IgnoreCase);
                return reg.Replace(query, newvalue);
            }

    2012年10月21日 10:02
  • 我已经赋值过了,貌似NameValueCollection只读的。

    尝试:

    NameValueCollection col = new NameValueCollection(); foreach(KeyValuePair<string,string> item in Request.QueryString) { col.Add(item.Key,item.Value); }

    //col.Remove("YourKey"); //Error here


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年10月21日 23:22
  • 它不是只读的,只读的原因是直接把request.querystring赋给它,它是个引用类型,而request.querystring是只读的。

    NameValueCollection myCol = new NameValueCollection();
                myCol.Add("red", "rojo");//如果键值red相同结果合并 rojo,rouge  
                myCol.Add("green", "verde");
                myCol.Add("blue", "azul");
                myCol.Add("red", "rouge");
                myCol.Remove("red");
                foreach (string kvp in myCol)
                {
                    Console.WriteLine(kvp);
                }

    2012年10月22日 2:17