リダイレクトのためにクエリ文字列から項目を削除するにはどうすればよいですか?
質問
私のベースページでは、クエリ文字列から項目を削除してリダイレクトする必要があります。使えない
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);
とにかく、私はそれなど何もテストしていませんが、うまくいくはずです(または少なくとも正しい方向に導くことができます)
他のヒント
代わりにそのコピーを操作することで、元のクエリ文字列への変更を避けることができます。次に、次のように、変更したクエリ文字列を含む 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);
Response.Redirect(String.Format("nextpage.aspx?{0}", Request.QueryString.ToString().Replace("foo", "mangledfoo")));
簡単にハックしてみますが、ほとんど節約できません。ただし、foo は nextpge.aspx で待機しているコードには存在しません:)
興味深い質問です。コレクションを手動でコピーする以外に実際に実行可能な代替手段は見当たりません。 コピー先 値のみを取得できます (キーは取得できません)。
私は思う ホリースタイルズのハック うまくいきます(ただし、QueryString に Replace を入れるのは不安です - obv.ユースケースによって異なります)が、気になることが 1 つあります。
ターゲット ページがそれを読み取っていない場合、なぜそれを 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);
検索ページは、強調表示するために「&項=」をクエリ文字列に追加するので、それを台無しにします。
他の唯一のオプションは正規表現の置換です。もし、あんたが 確かに知っています &terms がコレクションの途中にある場合は、正規表現の末尾の & をそのままにしておいてください。 確かに知っています これが最後にある場合は、末尾の & を削除し、置換文字列 "&" を String.Empty に変更します。
Response.Redirect(String.Format("nextpage.aspx?{0}", Regex.Replace(Request.QueryString.ToString(), "&terms=.*&", "&"));
Request.Url.GetLeftPart(UriPartial.Path)
これをすべきです
これはよりエレガントな解決策であることがわかりました
var qs = HttpUtility.ParseQueryString(Request.QueryString.ToString());
qs.Remove("item");
Console.WriteLine(qs.ToString());
これは、LINQ を使用するソリューションです。 Request.QueryString
これにより、必要に応じて qs params の複雑なフィルタリングが可能になります。
以下の例は、 uid
param を使用して、リダイレクトの準備ができた相対 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);
コレクションのクローンを作成し、クローンを作成した (および変更した) コレクションを含むページにリダイレクトできますか?
繰り返すよりも良いわけではないことはわかっています...