2014-01-22 11 views
18

Ich habe eine QueryString mit dem Namen "flagEdit" und ich möchte es entfernen, nachdem ich seinen Wert abgerufen habe. Aber wenn ich versuche, es zu entfernen, mitLöschen oder Entfernen der Abfragezeichenfolge in ASP.Net

Request.QueryString.Clear(); 

oder

Request.QueryString.Remove("editFlag"); 

Dieser Fehler tritt auf -

System.NotSupportedException: Sammlung ist schreibgeschützt.

Also, möchte ich wissen, wie Query-String nach entfernen holt es Wert

+3

Sie können nicht, weil Ihre Seite so genannt wurde. Die einzige Möglichkeit, die Abfragezeichenfolge zu löschen, besteht darin, eine Umleitung auf dieselbe URL auszuführen, jedoch ohne den Abfragezeichenfolgeteil. – Mark

+0

Sie können einen ähnlichen Ansatz [hier] betrachten (http://stackoverflow.com/questions/51964/how-do-i-remove-items-from-the-query-string-for-redirection) –

+2

Gibt es besondere Grund, warum Sie es gelöscht haben wollen? Wenn Sicherheit das Problem ist, verwenden Sie stattdessen einen POST-Aufruf oder verschlüsseln Sie die Abfragezeichenfolge. – BWHazel

Antwort

28

Removing (Deleting) Querystring in ASP.NET

Request.QueryString.Remove("editFlag") 

Wenn Sie die oben tun, werden Sie eine Fehlermeldung erhalten

Sammlung ist schreibgeschützt.

Also müssen wir den folgenden Code vor dem Löschen der Abfragezeichenfolge schreiben.

Versuchen Sie, diese Art und Weise

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("editFlag"); 

Sie auch auf diese Weise

var nvc = HttpUtility.ParseQueryString(Request.Url.Query); 
    nvc.Remove("editFlag"); 
    string url = Request.Url.AbsolutePath + "?" + nvc.ToString(); 
    Response.Redirect(url); 

hoffe, das hilft

+1

Das ist eine gute Antwort auf seine Frage, aber ich denke, die Frage verdient Aufmerksamkeit. Für was würdest du das überhaupt machen wollen? Die Realität ist, dass die Seite mit der intakten Querystring aufgerufen wurde; Sie können diese Tatsache nicht ändern, ob Sie die Parameter mögen oder nicht. Betrügt man den unerwünschten Parameter weg, ändert sich dies auch nicht. Also macht eine ReadOnlyCollection IMHO Sinn. Wäre es nicht besser, einen intelligenteren Code zu haben, der den Parameter einfach ignoriert? – increddibelly

+0

Da müssen Sie möglicherweise nur einen Wert in der Abfragezeichenfolge aktualisieren. Manchmal, besonders im Fall von geerbtem Code, müssen Sie unkonventionelle Dinge tun, um den bestehenden Code nicht zu brechen. – MetalPhoenix

+0

Es ist komisch. Es funktioniert nicht. – maxisam

1

ich mir die Freiheit in @Amarnath Balasubramanian ‚s Antwort versuchen oben genommen haben und machte es zu einer praktischen Funktion, die auch in VB.NET einfach aufgerufen werden kann.

public static bool RemoveQueryString(ref System.Web.HttpRequest httpReq, string key) 
{ 
    PropertyInfo requestQueryString = null; 
    bool bCanProceed = true; 
    try { 
     try { 
      requestQueryString = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); 
     } catch (System.Reflection.AmbiguousMatchException) { 
      bCanProceed = false; 
     } catch (System.ArgumentNullException) { 
      bCanProceed = false; 
     } 
     if (bCanProceed) { 
      try { 
       if (requestQueryString != null) { 
        // make collection editable 
        requestQueryString.SetValue(httpReq.QueryString, false, null); 
       } else bCanProceed = false; 

      } catch (System.Reflection.TargetException) { 
       bCanProceed = false; 
      } catch (System.Reflection.TargetParameterCountException) { 
       bCanProceed = false; 
      } catch (System.Reflection.TargetInvocationException) { 
       bCanProceed = false; 
      } catch (System.MethodAccessException) { 
       bCanProceed = false; 
      } catch (System.ArgumentException) { 
       bCanProceed = false; 
      } 
      if (bCanProceed) { 
       try { 
        // remove 
        httpReq.QueryString.Remove(key); 
       } catch (System.NotSupportedException) { 
        bCanProceed = false; 
       } 
      } 
     } 
    } catch (System.Exception) { 
     bCanProceed = false; 
    } 
    return bCanProceed; 
} 

Um dies von VB.NET nennen:

RemoveQueryString(Me.Request, "some_query_key_here") 
+0

Einige irriable Benutzer, die sowohl diese und die angenommene Antwort des Posters ablehnen! – t0mm13b

+1

Wow! Ich habe noch nie so viel Code gesehen, um Ausnahmen zu behandeln! 3 nützliche Zeilen Code und fast 40, um Ausnahmen zu behandeln (von denen einige nicht einmal geworfen werden können). – NickG

+0

Ich mag es, eine Methode zu verwenden. Ich würde es jedoch nicht so schreiben. Ich würde stattdessen GetProperties() abziehen und die beste Entscheidung alleine treffen, anstatt mich auf Fehlerfallen zu verlassen. Dann haben Sie einen Versuch, nur für den Fall zu fangen. IMO, du solltest an deiner Technik arbeiten. Gute Gedanken und guter Anfängercode, aber das meiste ist unnötig. –

4

Wenn Sie über zukünftige Seite Postbacks den gleichen Code ausgeführt wird Sie ausführen soll betroffen sind, wenn Abfragezeichen einen Wert hat, fügen Sie einfach ein if (! Page.IsPostBack) Bedingung.

3

Wenn Sie die gesamte QueryString löschen möchten, ist dies für mich gearbeitet:

Response.Redirect(Request.RawUrl.Replace(Request.Url.Query, "")); 

ich ein Formular klarte das einige Felder hatte Auto-bevölkert durch die QueryString, so dass die ganze Sache whack wollen.

Die Antworten der anderen Jungs sind jedoch wahrscheinlich besser, wenn Sie auf einen bestimmten Parameter abzielen und den Rest verlassen möchten.

Verwandte Themen