la SelectedValue
deduce ViewState
perché in Postback ricostruisce sua ListItems
dalla ViewState
e quindi imposta il valore selezionato sul DropDownList
dal Request
oggetto.
Non sta prendendo direttamente il valore Request
come SelectedValue
. Questo a sua volta è perché, ASP.Net può controllare se il postato DropDownList
non è stato manomesso dal client. Lo fa prima deserializzando gli articoli originali dal ViewState
. Quindi trova il valore Request
negli articoli e imposta la proprietà Selected
come true
. Solo ora è disponibile la proprietà SelectedValue
. (o SelectedIndex
per quella materia). Dovrebbe essere in grado di generare un evento SelectedIndexChanged
ora.
Questo è anche il motivo per cui non è necessario associare nuovamente lo DropDownList
allo PageLoad
. Le voci dell'elenco vengono ritirate automaticamente da ViewState
.
Se ViewState
è disattivato, non ci saranno voci di elenco originali nello ViewState
e sarà vuoto. Quindi non sarà in grado di contrassegnare alcun elemento come selezionato. Quindi lo SelectedValue
sarà 0 o lo SelectedItem
sarà nullo. Penso che l'evento SelectedIndexChanged
non verrà attivato. Affinché le cose funzionino in questo caso, è necessario eseguire l'associazione dati, preferibilmente su init
.
Tuttavia, ci sono soluzioni alternative.
completo Riferimento: http://msdn.microsoft.com/en-us/library/ms972976.aspx
Edit: (dopo i commenti di Op)
seguendo il ciclo di vita della pagina per vedere dove SelectedValue
si basa su ViewState
:
Fase 1 Init: Il controllo l'erararchia è costruita Se DropDownList è associato qui o ListItems è stato aggiunto in modo dichiarativo, la lista viene popolata qui.
Fase 2 Carica ViewState: Su PostBack, ViewState viene convalidato qui e caricato in DropDownList. C'è noSelectedValue
qui.
Fase 3 Caricare dati PostBack: qui viene preso il valore Request
(dalla richiesta del modulo) e quindi applicato al controllo. In questo caso di DropDownList
ora set il SelectedValue
dalla ricevuto Request
oggetto valore, implementazione interna è qualcosa di simile:
string selectedValue = HttpContext.Current.Request.Form[DropDownList_Id];
Items.FindByValue(selectedValue).Selected = true;
Ciò che è importante qui è che se ViewState non c'è e non è DropDownList dati- associato, quindi la raccolta ListItem sarà vuota e quindi la proprietà SelectedValue
è 0. Ciò non ha nulla a che fare con l'implementazione interna di una proprietà.
Se ViewState non è lì (disabilitato) e DropDownList è associato ai dati, la collezione ListItem sarà presente e l'elemento corrispondente verrà contrassegnato come selezionato e quindi la proprietà SelectedValue
restituirà il valore corretto.
Se la raccolta articoli è nuova (tramite una rilegatura con set di dati diverso o ViewState è invalidata), il valore del modulo Request
non verrà trovato nella raccolta articoli e nuovamente SelectedValue
non sarà valido.
Fase 4 Page Load: a questo punto i dati ViewState (o data-binding) e PostBack sono già stati caricati.
Fase 5 Sollevare PostBack evento: In questa fase l'evento OnSelectedIndexChanged
di DropDownList viene sparato se l'indice è stato modificato nella Fase 3.
Quindi, il SelectedValue
si basa su ViewState allo stadio 3. Naturalmente, se il controllo è appropriatamente legato ai dati quindi non si affiderà a ViewState come corollario.
SelectedValue
si affida a ViewState per assicurarsi che la raccolta di articoli sia stata compilata prima di impostarla. L'associazione dei dati/il re-binding è solo un altro modo per assicurarsi che la collezione di articoli sia popolata.
La speranza che chiarisce.
Bene il valore della casella di testo non si basa su viewstate, è possibile disabilitare viewstate e si otterrà comunque il valore della casella di testo, il suo valore deriva da IPostBackDataHandler. Request.Form [""] Funziona solo quando si inviano i dati utilizzando il metodo POST, Si consideri che un utente non è in grado di inviare un modulo a causa di errori di convalida o di qualsiasi errore con il quale il modulo non può essere pubblicato in quell'evento non è possibile ottieni i tuoi valori da Request.Form [""]. –
@surajsingh Lo so già. comunque la mia domanda rimane. –
Spero di essere sulla strada giusta ora, ho appena creato una lista a cascata usando listitems e mantiene lo stato anche dopo aver disabilitato ViewState. Devo ancora controllare il menu a discesa che è limitato dalle tabelle del database, vediamo se mantengono il loro stato e posso ottenere qualsiasi risposta. –