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

时间:2020-03-05 18:50:05  来源:igfitidea点击:

在我的基本页面中,我需要从查询字符串中删除一个项目并进行重定向。我不能用

Request.QueryString.Remove("foo")

因为该集合是只读的。有没有什么方法可以获取查询字符串(除了一项以外),而无需遍历集合并重新构建它?

解决方案

回答

Response.Redirect(String.Format("nextpage.aspx?{0}", Request.QueryString.ToString().Replace("foo", "mangledfoo")));

我很快就破解了,为我们省了不少钱。但是foo在nextpge.aspx中不会显示等待代码的代码:)

回答

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

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

回答

我们必须重建网址,然后重定向。像这样的东西:

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

无论如何,我没有进行任何测试,但是它应该可以工作(或者至少可以使我们朝正确的方向前进)

回答

有趣的问题。我看不到任何真正可行的替代手动复制集合的方法,因为CopyTo仅允许我们获取值(而不是键)。

我认为HollyStyles的Hack可以工作(尽管我很担心将Replace放到依赖于用例的QueryString中),但是有一件事困扰着我。

如果目标页面没有读取它,为什么需要将其从QueryString中删除?

会被忽略吗?

失败了,我想我们只需要硬着头皮,创建一个util方法即可为我们更改收藏。

更新-来自OP的回复

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

由于更改其他源代码(即搜索)是不可能的,因此我可能会说最好对字符串进行替换。公平地说,如果我们经常遇到与此类似的代码,则设置一个实用程序函数来克隆集合,并从数组中筛选出一组值,同样地快。

这样,我们就不必再担心此类问题了:)

回答

The search page appends "&terms=" to the query string for highlighting, so
  it messes it up.

唯一的其他选择是正则表达式替换。如果我们确定&terms位于集合的中间,则将尾部的&放在正则表达式中,如果我们确定其末尾,则删除尾部&并将替换字符串"&"更改为String.Empty

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

回答

我们可以通过处理原始查询字符串的副本来避免触摸原始查询字符串。然后,我们可以将页面重定向到包含修改后的查询字符串的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);