代码之家  ›  专栏  ›  技术社区  ›  Danimal

如何从查询字符串中删除项以进行重定向?

  •  8
  • Danimal  · 技术社区  · 18 年前


    Request.QueryString.Remove("foo")
    

    10 回复  |  直到 16 年前
        1
  •  10
  •   Ziad    13 年前

    您可以通过处理原始查询字符串的副本来避免触及原始查询字符串。然后,您可以将页面重定向到包含修改的查询字符串的url,如下所示:

        var nvc = new NameValueCollection();
    
        nvc.Add(HttpUtility.ParseQueryString(Request.Url.Query));
    
        nvc.Remove("foo");
    
        string url = Request.Url.AbsolutePath;
    
        for (int i = 0; i < nvc.Count; i++)
            url += string.Format("{0}{1}={2}", (i == 0 ? "?" : "&"), nvc.Keys[i], nvc[i]);
    
        Response.Redirect(url);
    

    事实证明,我们可以像这样简化代码:

        var nvc = HttpUtility.ParseQueryString(Request.Url.Query);
    
        nvc.Remove("foo");
    
        string url = Request.Url.AbsolutePath + "?" + nvc.ToString();
    
        Response.Redirect(url);
    
        2
  •  8
  •   Ryan Farley    18 年前

    您必须重新构建url,然后重定向。大概是这样的:

    string url = Request.RawUrl;
    
    NameValueCollection 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);
    

    不管怎样,我没有测试它或任何东西,但它应该会工作(或至少让你在正确的方向)

        3
  •  2
  •   hollystyles    18 年前
    Response.Redirect(String.Format("nextpage.aspx?{0}", Request.QueryString.ToString().Replace("foo", "mangledfoo")));
    

        4
  •  2
  •   Community Mohan Dere    6 年前

    有趣的问题。我没有看到任何真正可行的替代方法来手动复制集合,因为 方法

    我想 HollyStyles' Hack 可能会起作用(尽管我会因为在QueryString-obv中放置替换项而感到紧张,这取决于用例),但有一件事困扰着我。。

    它会被忽略吗?

    如果做不到这一点,我认为您只需要咬紧牙关,创建一个util方法来为您更改集合。

    更新-根据OP的回复

    啊!我现在明白了,是的,我在SiteMap执行字符串的完全比较时也遇到过类似的问题。

        5
  •  2
  •   Sirko    14 年前

    HttpUtility.ParseQueryString(Request.Url.Query) 回报是 QueryStringValueCollection . 它是继承自 NameValueCollection

        var qs = HttpUtility.ParseQueryString(Request.Url.Query);
        qs.Remove("foo"); 
    
        string url = "~/Default.aspx"; 
        if (qs.Count > 0)
           url = url + "?" + qs.ToString();
    
        Response.Redirect(url); 
    
        6
  •  0
  •   hollystyles    18 年前

    搜索页面在查询字符串后附加“&terms=”以突出显示,因此 它把事情搞砸了。

    唯一的其他选项是正则表达式替换。如果你 那,;术语是在中间集合的某处留下尾随和放大器;在正则表达式中,如果你 肯定知道 它在末端,然后放下尾随&并将替换字符串“&”更改为string.Empty

    Response.Redirect(String.Format("nextpage.aspx?{0}", Regex.Replace(Request.QueryString.ToString(), "&terms=.*&", "&"));
    
        7
  •  0
  •   sth    14 年前

    Request.Url.GetLeftPart(UriPartial.Path) 我们应该这样做

        8
  •  0
  •   Chris    14 年前

    var qs = HttpUtility.ParseQueryString(Request.QueryString.ToString());
    qs.Remove("item");
    Console.WriteLine(qs.ToString());
    
        9
  •  0
  •   biofractal    13 年前

    Request.QueryString 如果需要,允许对qs参数进行复杂过滤。

    uid

    之前: http://www.domain.com/home.aspx?color=red&uid=1&name=bob

    ~/home.aspx?color=red&name=bob

    从url中删除QS参数

    var rq = this.Request.QueryString;
    var qs = string.Join("&", rq.Cast<string>().Where(k => k != "uid").Select(k => string.Format("{0}={1}", k, rq[k])).ToArray());
    var url = string.Concat("~", Request.RawUrl.Split('?')[0], "?", qs);
    
        10
  •  -1
  •   shsteimer    18 年前

    是否可以克隆集合,然后重定向到包含克隆(和修改)集合的页面?

    我知道这并不比迭代好多少。。。