私の基本ページでは、クエリ文字列からアイテムを削除してリダイレクトする必要があります。使えない
Request.QueryString.Remove("foo")
コレクションは読み取り専用であるためです。コレクションを反復処理して再構築せずにクエリ文字列を取得する方法はありますか (その 1 つの項目を除く)。
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")));
私は簡単にハックして、少し節約します。ただし、 nextpge.aspx でそれを待っているコードには foo は存在しません:)
興味深い質問です。CopyToでは値のみを取得できるため (キーは取得できません) 、コレクションを手動でコピーする以外に実際に実行可能な方法はありません。
HollyStyles の Hackはうまくいくと思います(ただし、Replace を QueryString に入れることに神経質になりますが、明らかにユース ケースによって異なります) が、気になることが 1 つあります。
ターゲット ページがそれを読み取っていない場合、なぜそれを 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());
検索ページは強調表示のためにクエリ文字列に「&terms=」を追加するため、めちゃくちゃになります。
他のオプションのみが正規表現の置き換えです。&terms がコレクションの途中にあることが確実にわかっている場合は、末尾の & を正規表現のどこかに残しておきます。末尾にあることが確実にわかっている場合は、末尾の & を削除し、置換文字列 "&" を String.Empty に変更します。
Response.Redirect(String.Format("nextpage.aspx?{0}", Regex.Replace(Request.QueryString.ToString(), "&terms=.*&", "&"));
Request.Url.GetLeftPart(UriPartial.Path)
これを行う必要があります
Request.QueryString
これは、必要に応じて qs パラメータの複雑なフィルタリングを可能にするに対して LINQ を使用するソリューションです。
以下の例は、パラメータをフィルタリングして、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);
コレクションを複製して、複製された (および変更された) コレクションを含むページにリダイレクトできますか?
私はそれが反復よりもはるかに優れていないことを知っています...