簡體   English   中英

如何從查詢字符串中刪除項目以進行重定向?

[英]How do I remove items from the query string for redirection?

在我的基頁中,我需要從查詢字符串中刪除一個項目並重定向。 我不能用

Request.QueryString.Remove("foo")

因為該集合是只讀的。 有沒有辦法獲取查詢字符串(除了那一項)而不迭代整個集合並重新構建它?

您可以通過處理原始查詢字符串來避免觸及原始查詢字符串。 然后,您可以將頁面重定向到包含修改后的查詢字符串的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);

您必須重建網址然后重定向。 像這樣的東西:

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

無論如何,我沒有測試那個或任何東西,但它應該工作(或至少讓你在正確的方向)

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

我快速破解,拯救你一點點。 但是foo將不會出現在nextpge.aspx中等待它的代碼:)

有趣的問題。 我沒有看到任何真正可行的替代手動復制集合,因為CopyTo只允許你獲取值(而不是鍵)。

我認為HollyStyles的Hack會起作用(雖然我會擔心將一個替換放在一個QueryString中 - 依賴於用例),但有一件事困擾着我。

如果目標頁面沒有讀取它,為什么需要從QueryString中刪除它?

它會被忽略嗎?

如果做不到這一點,我認為你只需要咬緊牙關並創建一個util方法來為你改變收藏。

更新 - 遵循OP的回應

哈啊! 我現在看到了,是的,我遇到了與SiteMap進行完全比較的類似問題。

由於更改其他源代碼(即搜索)是不可能的,我可能會說最好對字符串執行替換。 雖然公平地說,如果您經常遇到與此類似的代碼,那么設置實用程序函數以克隆集合同樣快速,從中過濾一系列值。

這樣你再也不用擔心這樣的問題了:)

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

我發現這是一個更優雅的解決方案

var qs = HttpUtility.ParseQueryString(Request.QueryString.ToString());
qs.Remove("item");
Console.WriteLine(qs.ToString());

這是一個針對Request.QueryString使用LINQ的解決方案,它允許在需要時對qs參數進行復雜的過濾。

下面的示例顯示我過濾掉uid參數以創建准備重定向的相對URL。

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

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

從網址中刪除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);

搜索頁面將“&terms =”附加到查詢字符串以突出顯示,因此將其混亂。

只有其他選項是正則表達式替換。 如果你肯定知道&terms是在集合的中間某處留下尾隨&在正則表達式中,如果你確定它在最后然后刪除尾隨&並將替換字符串“&”更改為String.Empty

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

Request.Url.GetLeftPart(UriPartial.Path)應該這樣做

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

我知道它比迭代好多了......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM