die SelectedValue
beruht auf ViewState
weil beim Postback es seine ListItems
vom ViewState
umbaut und stellt dann den ausgewählten Wert auf der DropDownList
vom Request
Gegenstand.
Es wird nicht die Request
Wert als SelectedValue
direkt übernommen. Dies liegt wiederum daran, dass ASP.Net prüfen kann, ob der gepostete DropDownList
nicht am Client manipuliert wurde. Dies geschieht, indem zuerst die ursprünglichen Artikel aus der ViewState
deserialisiert werden. Es findet dann den Request
Wert in den Elementen und legt seine Selected
-Eigenschaft als true
fest. Nur jetzt ist die SelectedValue
Eigenschaft verfügbar. (oder SelectedIndex
für diese Angelegenheit). Es sollte nun möglich sein, ein SelectedIndexChanged
Ereignis auszulösen.
Dies ist auch der Grund, dass Sie die DropDownList
nicht erneut in PageLoad
binden müssen. Die Listenelemente werden automatisch von der ViewState
entfernt.
Wenn die ViewState
deaktiviert ist, dann wird es keine ursprünglichen Listenelemente in der ViewState
geben und wird leer sein. Daher ist es nicht möglich, einen Gegenstand als ausgewählt zu markieren. Daher wird SelectedValue
0 sein oder SelectedItem
wird null sein. Ich denke, das Ereignis SelectedIndexChanged
wird auch nicht ausgelöst. Damit Dinge in diesem Fall funktionieren, muss eine Datenbindung erfolgen, vorzugsweise unter init
.
Es gibt jedoch Problemumgehungen.
komplette Referenz: http://msdn.microsoft.com/en-us/library/ms972976.aspx
bearbeiten: (nach Op Kommentare)
Lebenszyklus der Seite verfolgt zu sehen, wo SelectedValue
auf ViewState
beruht:
Stufe 1 Init: Die Steuerung Hierarchy ist gebaut. Wenn die DropDownList hier gebunden ist oder die ListItems deklarativ hinzugefügt wurden, wird die Liste hier eingetragen.
Phase 2 Load ViewState: Bei PostBack wird der ViewState hier validiert und in die DropDownList geladen. Es gibt keineSelectedValue
hier.
Stufe 3 Lastpostback Daten: Hier wird der Request
Wert (aus dem Formular Anfrage) entnommen und dann auf die Steuerung angewendet. In diesem Fall von DropDownList
es jetzt Sets die SelectedValue
aus dem empfangenen Request
Objektwert, interne Implementierung so etwas wie diese:
string selectedValue = HttpContext.Current.Request.Form[DropDownList_Id];
Items.FindByValue(selectedValue).Selected = true;
Was hier wichtig ist, ist, dass, wenn Viewstate nicht da ist und nicht Dropdown Daten- ist gebunden, dann ist die ListItem-Auflistung leer und daher SelectedValue
Eigenschaft ist 0. Das hat nichts mit interner Implementierung einer Eigenschaft zu tun.
Wenn der ViewState nicht vorhanden ist (deaktiviert) und DropDownList datengebunden ist, dann wird die ListItem-Auflistung vorhanden sein und das entsprechende Element wird als ausgewählt markiert. Daher gibt die SelectedValue
-Eigenschaft den korrekten Wert zurück.
Wenn die Elementauflistung neu ist (durch eine erneute Bindung mit anderen Datensätzen oder ViewState wird ungültig gemacht), wird der Formularwert Request
nicht in der Objektauflistung gefunden und wiederum SelectedValue
ungültig.
Phase 4 Laden der Seite: Zu diesem Zeitpunkt wurden die Daten ViewState (oder Datenbindung) und PostBack bereits geladen.
Stufe 5 Raise Postbackereignis: In diesem Stadium des OnSelectedIndexChanged
Fall Dropdown ausgelöst wird, wenn der Index in Stufe 3.
daher geändert wurde, stützt sich die SelectedValue
auf Viewstate in Stufe 3. Natürlich, wenn Das Steuerelement ist in geeigneter Weise datengebunden. Dann wird es nicht auf ViewState als Korollar angewiesen.
SelectedValue
verlässt sich auf ViewState, um sicherzustellen, dass die Objektauflistung vor dem Festlegen ausgefüllt wurde. Datenbindung/Neubindung ist nur eine weitere Möglichkeit, um sicherzustellen, dass die Elementauflistung gefüllt ist.
Hoffnung, die klärt.
Gut Textbox Wert nicht auf Viewstate verlassen Sie Viewstate deaktivieren können und Sie erhalten noch Textfeld Wert, Sein Wert kommt von IPostBackDataHandler. Request.Form [""] Funktioniert nur, wenn Sie Ihre Daten mit der POST-Methode übermitteln. Stellen Sie sich vor, ein Benutzer kann ein Formular aufgrund von Validierungsfehlern oder Fehlern nicht senden Holen Sie sich Ihre Werte von Request.Form [""]. –
@surajsingh Das weiß ich schon. immer noch meine Frage bleibt. –
Hoffe, ich bin jetzt auf dem richtigen Weg, ich habe nur eine Dropdown-Liste mit Listenelementen erstellt und es behält den Status auch nach der Deaktivierung von ViewState. Ich muss immer noch nach Drop-downs suchen, die über Datenbanktabellen begrenzt sind. Mal sehen, ob sie ihren Status behalten und ob ich eine Antwort bekomme. –