2016-08-03 22 views
-1

Problem am wahrscheinlichsten ist mit dem QueryString. Alles fällt auseinander, wenn ich von der Ergebnisseite zur Suchseite zurückkehre. Ich verwende den QueryString, um alle Kontrollkästchen zu aktivieren, die vor der Generierung der Ergebnisseite aktiviert wurden. Diesmal kann ich die Kontrollkästchen deaktivieren, aber nur visuell. Die Ergebnisseite wird so generiert, als ob sie noch überprüft würde.Kann Kontrollkästchen nicht deaktivieren. ASP.NET

Hier ist ein einfaches Beispiel dafür. Ich habe Checkbox und eine Schaltfläche hinzugefügt ...

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Request.QueryString["B1"] != null) 
    { 
     CheckBox1.Checked = true; 
    } 
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    string QString = null; 
    if (CheckBox1.Checked) 
    { 
     QString += "?B1=1"; 
    } 
    Response.Redirect("/TestPage1.aspx" + QString); 
} 

Wenn ich Default.aspx gehen und wenn ich hinzufügen? "B1 = 1" (Default.aspx? B1 = 1) I erhalten Seite, wo Kontrollkästchen aktiviert ist . Wenn ich es abnehme und Button1 drücke, werde ich zur Seite "TestPage1.aspx? B1 = 1" umgeleitet.

Hat jemand eine Lösung für dieses Problem?

+0

Checkboxen und Radiobuttons sind in ASP.net ziemlich fehlerhaft. Sieh dir diesen Thread an: http://stackoverflow.com/questions/1523606/asp-net-checkbox-value-at-postback-is-wrong – Sal

Antwort

1

Wenn ich richtig verstehe, sind Sie auf TestPage1 mit der Checkbox aktiviert (/TestPage1.aspx?B1=1) und wenn Sie manuell auf das Kontrollkästchen deaktivieren und klicken Sie auf Button1 Sie zu /TestPage1.aspx?B1=1 und das Kontrollkästchen erneut geprüft wird jetzt.

Dies tritt auf, weil das Ereignis Page_Load vor Steuerungsereignissen ausgelöst wird, z. B. Ereignis von Button1. Here is the MSDN documentation Detaillierung der Seitenlebenszyklusereignisse.

Da die Seite zurück an die /TestPage1.aspx?B1=1 Posting, der Page_Load Handler sieht den Abfrage-String, bevor die Button1_Click eine Chance, es zu entfernen hat. Zu dem Zeitpunkt, zu dem der Button1_Click -Handler ausgeführt wird, wurde das Kontrollkästchen bereits erneut überprüft, und der Handler leitet zurück zu derselben URL, der enthaltenen Abfragezeichenfolge.

Eine einfache Lösung für Ihr Beispiel wäre, überprüfen Sie die IsPostBack Eigenschaft in Ihrem Page_Load Ereignis und nur das Kontrollkästchen, wenn die Seite nicht zurückgibt.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack && Request.QueryString["B1"] != null) 
    { 
     CheckBox1.Checked = true; 
    } 
} 
0

Es geht so:

  1. Sie /TestPage1.aspx?B1=1 in Ihrem Browser geladen haben.
  2. Sie deaktivieren CheckBox1 im Browser und klicken Button1
  3. Page_Load() läuft auf dem Server für die volle /TestPage1.aspx?B1=1 Adresse. Es sieht den B1 Query-String, so dass CheckBox1 erneut als überprüft gesetzt wird.
  4. Button1_Click() läuft auf dem Server. Es sieht CheckBox1 ist jetzt überprüft, so QString enthält wieder B1. Der Server leitet jetzt /TestPage1.aspx?B1=1 (das vollständige Abfrage-String noch enthalten ist.
  5. Page_Load() läuft wieder, und die CheckBox1 wird einmal mehr eingestellt, wie geprüft.
  6. Die Seite wird schließlich zurück an den Browser gesendet, wo Sie beobachten Checkbox1 sind jetzt geprüft.

Wenn Sie nur TestPage1.aspx im Browser (ohne ?B1=1) Sie würde Lage sein, die Checkbox deaktiviert zu lassen. Aber solange die ?B1=1 ist, ist der Zyklus der Ereignisse immer Ich werde es wieder zurücklegen.

Der häufigste Fehler hier ist Schritt 3 nicht zu erwarten. Denken Sie daran, dass alle Serverereignisse (auch einfache Tastenklicks) als Teil der full page lifecycle ausgeführt werden. Sie können dazu beitragen, indem Sie Page_Load() ändern, um einen !IsPostBack() Test einzuschließen, bevor Sie das Kontrollkästchen aktivieren.

Verwandte Themen