web-dev-qa-db-ja.com

C#を使用してasp.netのクエリ文字列からアイテムを削除するにはどうすればよいですか?

URLから「言語」クエリ文字列を削除します。これどうやってするの ? (Asp.net 3.5、c#を使用)

Default.aspx?Agent=10&Language=2

「Language = 2」を削除したいのですが、言語が最初、中間、または最後になります。だから私はこれを持っています

Default.aspx?Agent=20
54
Barbaros Alp

類似の質問 少し前に答えました。基本的に、最良の方法は、HttpValueCollectionプロパティが実際にあるクラスQueryStringを使用することです。残念ながら、それは.NETフレームワークの内部にあります。 Reflectorを使用して取得できます(Utilsクラスに配置します)。この方法では、NameValueCollectionのようにクエリ文字列を操作できますが、すべてのURLエンコード/デコードの問題に注意してください。

HttpValueCollectionNameValueCollectionを拡張し、エンコードされたクエリ文字列(アンパサンドと疑問符を含む)を受け取るコンストラクタを持ち、ToString()メソッドをオーバーライドしてクエリ文字列を後で再構築します基礎となるコレクションから。

10
Igal Tabachnik

HttpRequest.QueryStringの場合は、コレクションを書き込み可能なコレクションにコピーして、自由に使用できます。

NameValueCollection filtered = new NameValueCollection(request.QueryString);
filtered.Remove("Language");
115
xcud

これが簡単な方法です。リフレクターは必要ありません。

_    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()が必要です。

46

最後に、

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 );
36
Barbaros Alp

ここでの個人的な好みは、クエリを書き換えるか、より低いポイントで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);
26
annakata

これを試して ...

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");
3
Vishal Nayan
  1. _HttpContext.Request.QueryString_を使用してクエリ文字列を収集します。デフォルトはNameValueCollectionタイプです。
  2. それを文字列としてキャストし、System.Web.HttpUtility.ParseQueryString()を使用してクエリ文字列を解析します(これはNameValueCollectionを再度返します)。
  3. その後、Remove()関数を使用して特定のパラメーターを削除できます(削除するパラメーターを参照するキーを使用)。
  4. クエリパラメータを使用して文字列に戻し、string.Join()を使用して、有効なクエリパラメータとしてURLで読み取り可能なものとしてクエリ文字列をフォーマットします。

作業例については、以下を参照してください。_param_to_remove_は削除するパラメーターです。

クエリパラメータが_param1=1&param_to_remove=stuff&param2=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&param2=2_になります。

1
Blairg23

Requestオブジェクト内の所定の場所でQuerystringを変更しようとしているかどうかを明確にしないでください。このプロパティは読み取り専用なので、文字列をいじりたいだけであると仮定します。

...その場合、境界線は簡単です。

  • リクエストからクエリ文字列を取得します
  • .split() '&'で
  • 「言語」で始まるものを探して放り投げながら、新しい文字列にまとめます
1
Jason Kester

クエリ文字列コレクションを取得し、(_name=value pair_)文字列に解析して、削除するものを除き、newQueryStringという名前を付けます。

次にResponse.Redirect(known_path?newqueryString);を呼び出します

1
Pita.O

クエリ文字列を解析してNameValueCollectionにします。アイテムを削除します。 toStringを使用して、クエリ文字列に変換し直します。

using System.Collections.Specialized;

NameValueCollection filteredQueryString = System.Web.HttpUtility.ParseQueryString(Request.QueryString.ToString());
filteredQueryString.Remove("appKey");

var queryString = '?'+ filteredQueryString.ToString();
0
Kurkula

まあ私は簡単な解決策を持っていますが、少し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>");
0
Segev Dagan

すでにクエリ文字列を文字列として持っている場合は、単純な文字列操作も使用できます。

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);
}
0
Pedro Geada

おそらく、正規表現を使用してクエリ文字列から削除するパラメーターを見つけ、それを削除して、ブラウザーを新しいクエリ文字列と同じファイルにリダイレクトすることになるでしょう。

0
RKitson

はい。クエリ文字列を編集するための.NETに組み込まれているクラスはありません。正規表現または文字列自体を変更する他の方法を使用する必要があります。

0
David Morton
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, "");

https://regexr.com/3i9vj

0
yajiv