URLから「言語」クエリ文字列を削除します。これどうやってするの ? (Asp.net 3.5、c#を使用)
Default.aspx?Agent=10&Language=2
「Language = 2」を削除したいのですが、言語が最初、中間、または最後になります。だから私はこれを持っています
Default.aspx?Agent=20
類似の質問 少し前に答えました。基本的に、最良の方法は、HttpValueCollection
プロパティが実際にあるクラスQueryString
を使用することです。残念ながら、それは.NETフレームワークの内部にあります。 Reflectorを使用して取得できます(Utilsクラスに配置します)。この方法では、NameValueCollectionのようにクエリ文字列を操作できますが、すべてのURLエンコード/デコードの問題に注意してください。
HttpValueCollection
はNameValueCollection
を拡張し、エンコードされたクエリ文字列(アンパサンドと疑問符を含む)を受け取るコンストラクタを持ち、ToString()
メソッドをオーバーライドしてクエリ文字列を後で再構築します基礎となるコレクションから。
HttpRequest.QueryStringの場合は、コレクションを書き込み可能なコレクションにコピーして、自由に使用できます。
NameValueCollection filtered = new NameValueCollection(request.QueryString);
filtered.Remove("Language");
これが簡単な方法です。リフレクターは必要ありません。
_ public static string GetQueryStringWithOutParameter(string parameter)
{
var nameValueCollection = System.Web.HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString());
nameValueCollection.Remove(parameter);
string url = HttpContext.Current.Request.Path + "?" + nameValueCollection;
return url;
}
_
_Request.QueryString
_コレクションは読み取り専用であるため、ここではQueryString.ToString()
が必要です。
最後に、
hmemcpyの回答は完全に私のためであり、回答した他の友人に感謝します。
Reflectorを使用してHttpValueCollectionを取得し、次のコードを記述しました
var hebe = new HttpValueCollection();
hebe.Add(HttpUtility.ParseQueryString(Request.Url.Query));
if (!string.IsNullOrEmpty(hebe["Language"]))
hebe.Remove("Language");
Response.Redirect(Request.Url.AbsolutePath + "?" + hebe );
ここでの個人的な好みは、クエリを書き換えるか、より低いポイントでnamevaluecollectionを使用することですが、ビジネスロジックがこれらのいずれも非常に役に立たない場合があります。このような状況では、次のような瞬間に読み取り専用フラグをオフにすることができます。
// reflect to readonly property
PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
// make collection editable
isreadonly.SetValue(this.Request.QueryString, false, null);
// remove
this.Request.QueryString.Remove("foo");
// modify
this.Request.QueryString.Set("bar", "123");
// make collection readonly again
isreadonly.SetValue(this.Request.QueryString, true, null);
これを試して ...
PropertyInfo isreadonly =typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
isreadonly.SetValue(this.Request.QueryString, false, null);
this.Request.QueryString.Remove("foo");
HttpContext.Request.QueryString
_を使用してクエリ文字列を収集します。デフォルトはNameValueCollection
タイプです。System.Web.HttpUtility.ParseQueryString()
を使用してクエリ文字列を解析します(これはNameValueCollection
を再度返します)。Remove()
関数を使用して特定のパラメーターを削除できます(削除するパラメーターを参照するキーを使用)。string.Join()
を使用して、有効なクエリパラメータとしてURLで読み取り可能なものとしてクエリ文字列をフォーマットします。作業例については、以下を参照してください。_param_to_remove
_は削除するパラメーターです。
クエリパラメータが_param1=1¶m_to_remove=stuff¶m2=2
_であるとします。次の行を実行します。
_var queryParams = System.Web.HttpUtility.ParseQueryString(HttpContext.Request.QueryString.ToString());
queryParams.Remove("param_to_remove");
string queryString = string.Join("&", queryParams.Cast<string>().Select(e => e + "=" + queryParams[e]));
_
これで、クエリ文字列は_param1=1¶m2=2
_になります。
Requestオブジェクト内の所定の場所でQuerystringを変更しようとしているかどうかを明確にしないでください。このプロパティは読み取り専用なので、文字列をいじりたいだけであると仮定します。
...その場合、境界線は簡単です。
クエリ文字列コレクションを取得し、(_name=value pair
_)文字列に解析して、削除するものを除き、newQueryStringという名前を付けます。
次にResponse.Redirect(known_path?newqueryString)
;を呼び出します
クエリ文字列を解析してNameValueCollectionにします。アイテムを削除します。 toStringを使用して、クエリ文字列に変換し直します。
using System.Collections.Specialized;
NameValueCollection filteredQueryString = System.Web.HttpUtility.ParseQueryString(Request.QueryString.ToString());
filteredQueryString.Remove("appKey");
var queryString = '?'+ filteredQueryString.ToString();
まあ私は簡単な解決策を持っていますが、少しjavascriptが関与しています。
クエリ文字列が「ok = 1」であると仮定します
string url = Request.Url.AbsoluteUri.Replace("&ok=1", "");
url = Request.Url.AbsoluteUri.Replace("?ok=1", "");
Response.Write("<script>window.location = '"+url+"';</script>");
すでにクエリ文字列を文字列として持っている場合は、単純な文字列操作も使用できます。
int pos = queryString.ToLower().IndexOf("parameter=");
if (pos >= 0)
{
int pos_end = queryString.IndexOf("&", pos);
if (pos_end >= 0) // there are additional parameters after this one
queryString = queryString.Substring(0, pos) + queryString.Substring(pos_end + 1);
else
if (pos == 0) // this one is the only parameter
queryString = "";
else // this one is the last parameter
queryString=queryString.Substring(0, pos - 1);
}
おそらく、正規表現を使用してクエリ文字列から削除するパラメーターを見つけ、それを削除して、ブラウザーを新しいクエリ文字列と同じファイルにリダイレクトすることになるでしょう。
はい。クエリ文字列を編集するための.NETに組み込まれているクラスはありません。正規表現または文字列自体を変更する他の方法を使用する必要があります。
string queryString = "Default.aspx?Agent=10&Language=2"; //Request.QueryString.ToString();
string parameterToRemove="Language"; //parameter which we want to remove
string regex=string.Format("(&{0}=[^&\s]+|{0}=[^&\s]+&?)",parameterToRemove);
string finalQS = Regex.Replace(queryString, regex, "");