8

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

Request.QueryString.Remove("foo")

因为该集合是只读的。有没有办法在不遍历集合并重新构建它的情况下获取查询字符串(除了那个项目)?

4

10 回答 10

10

您可以通过处理原始查询字符串的副本来避免触及原始查询字符串。然后,您可以将页面重定向到包含修改后的查询字符串的 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);
于 2009-10-27T19:05:57.617 回答
8

您必须重建 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);

无论如何,我没有测试它或任何东西,但它应该可以工作(或者至少让你朝着正确的方向前进)

于 2008-09-09T14:21:42.223 回答
2
Response.Redirect(String.Format("nextpage.aspx?{0}", Request.QueryString.ToString().Replace("foo", "mangledfoo")));

我快速破解,节省你一点。但是 foo 不会出现在 nextpge.aspx 中等待它的代码:)

于 2008-09-09T14:14:58.620 回答
2

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

我认为HollyStyles 的 Hack会起作用(尽管我会担心在 QueryString 中放置一个 Replace - obv。取决于用例),但有一件事困扰着我。

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

它会被忽略吗?

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

更新 - 来自 OP 的回应

啊啊啊!我现在明白了,是的,我在使用 SiteMap 对字符串进行完整比较时遇到了类似的问题。

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

这样您就不必再担心此类问题了:)

于 2008-09-09T14:26:10.917 回答
2

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); 
于 2011-11-17T14:52:26.557 回答
0

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

只有其他选项是正则表达式替换。如果您确定&terms 位于集合的中间某处,请将尾随 & 留在正则表达式中,如果您确定它在末尾,则删除尾随 & 并将替换字符串“&”更改为 String.Empty

Response.Redirect(String.Format("nextpage.aspx?{0}", Regex.Replace(Request.QueryString.ToString(), "&terms=.*&", "&"));
于 2008-09-09T15:15:33.420 回答
0

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

于 2012-01-18T23:27:02.910 回答
0

我发现这是一个更优雅的解决方案

var qs = HttpUtility.ParseQueryString(Request.QueryString.ToString());
qs.Remove("item");
Console.WriteLine(qs.ToString());
于 2012-05-02T10:44:55.227 回答
0

这是一个使用 LINQ 的解决方案,Request.QueryString它允许在需要时对 qs 参数进行复杂过滤。

下面的示例显示我过滤掉uid参数以创建一个准备好重定向的相对 url。

前: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);
于 2013-04-29T12:56:30.537 回答
-1

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

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

于 2008-09-09T14:17:34.403 回答