1

次のようなクエリ文字列があります。

"somename1=123&QueryString=PlaceHolder%3dNothing%26anotherid%3dsomevalue&somename=somevalue"

しかし、クエリ文字列を以下のクエリ文字列のようなものにして、クエリ文字列全体を更新されたものに置き換えたいのですが、リダイレクトせずにそれを行う方法はありますか?

"somename1=somevalue1&PlaceHolder=Nothing&somename2=somevalue2&somename3=somevalue3"

基本的に削除する必要があります: "QueryString=" と空の文字列 "%3d" と "&" "%26" と "="

これまでに行ったのは次のとおりです。

string strQueryString = Request.QueryString.ToString();
if (strQueryString.Contains("QueryString="))
{
    strQueryString = strQueryString.Replace("QueryString=", "");
    if (strQueryString.Contains("%26")) strQueryString = strQueryString.Replace("%26", "&");
    if (strQueryString.Contains("%3d")) strQueryString = strQueryString.Replace("%3d", "=");
    string x = strQueryString;
}

と:

 // 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);
if (this.Request.QueryString.ToString().Contains("QueryString="))
{
    this.Request.QueryString.ToString().Replace("QueryString=", "");
    if (this.Request.QueryString.ToString().Contains("%26")) this.Request.QueryString.ToString().Replace("%26", "&");
    if (this.Request.QueryString.ToString().Contains("%3d")) this.Request.QueryString.ToString().Replace("%3d", "=");
    string x = this.Request.QueryString.ToString();
}

// make collection readonly again
isreadonly.SetValue(this.Request.QueryString, true, null);

コードの 2 番目の部分は文字を置き換えていません。すべての文字を削除したり、それらを置き換えたりした後、クエリ文字列を新しいクエリ文字列に変更する方法がわかりません。

どんな助けでも大歓迎です。

4

2 に答える 2

6

現在のリクエストのクエリ文字列の変更はサポートされていません。プライベート リフレクションを使用してメモリ内の状態を編集すると、クエリ文字列が不変であると想定されるため、ASP.NET が破損する可能性が高くなります。クエリ文字列を変更する唯一の方法は、リダイレクトを実行するか、同じページに対して別のクエリ文字列を使用して新しい HTTP 要求を作成するなど、一種のサブ要求を実行することによって、新しい要求を発行することです。

于 2013-04-09T17:44:38.783 に答える
2

あまり知られていない組み込みのキー/値ディクショナリ、Context.Itemsをお勧めします。

これにより、読み取り専用の QueryString オブジェクトを切り替えるよりも優れたパフォーマンスが得られ、リクエスト全体で持続するため、モジュール、ハンドラーなどの間で共有できます。

作成

string strQueryString = Request.QueryString.ToString();
if (strQueryString.Contains("QueryString="))
{
    HttpContext.Current.Items("qs") = strQueryString.Replace("QueryString=", "").Replace("%26", "&").Replace("%3d", "=");
}

使用する

string x = HttpContext.Current.Items("qs_d").ToString();

サイドノート:コードをいくつか短縮しました。何かが含まれているかどうかを最初に確認する必要はなく、含まれている場合は置き換えて、置き換えを実行するだけで高速になります。

于 2016-03-02T08:54:45.613 に答える