[英]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方法來為你改變收藏。
哈啊! 我現在看到了,是的,我遇到了與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=bob
: http://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.