Le proprietà di Asp.net BasePage mediante ViewState vengono cancellate su Postback
-
06-07-2019 - |
Domanda
Ecco le basi del mio setup:
Ho una classe BasePage che eredita da System.Web.UI.Page. BasePage ha due proprietà implementate in modo tale che il loro get / set lo faccia da due diversi elementi nella raccolta ViewState (ex this.ViewState [" Year "] dalla BasePage).
Ho un'altra classe che poi eredita da BasePage, chiamiamola SpecificBasePage.
Infine, ho una pagina aspx che eredita SpecificBasePage.
Ho aggiunto punti di interruzione e ho fatto molte ricerche sul mio codice e ho scoperto che al caricamento della pagina iniziale, a entrambe le proprietà dello stato di visualizzazione sono assegnati valori e i valori persistono per tutto il ciclo di vita del caricamento della prima pagina.
Quando la pagina viene pubblicata nuovamente, durante l'evento Page_Load e altri gestori di eventi (quando deve essere caricato ViewState), entrambe le proprietà restituiscono null. Ispezionando this.ViewState.Count mostra che non ci sono oggetti nella raccolta.
Qualcuno può pensare a qualcosa che potrei fare da qualche parte che possa influenzare ViewState e causare questo comportamento?
- Addizione L'ho isolato in una parte del mio codice. Al caricamento iniziale, fornisco i valori delle proprietà viewstate in OnInit, ho scoperto che quando sposto questo su OnLoad, i valori persistono sul post. Immagino che anche se i valori dello stato di visualizzazione aggiunti persistono per tutto il ciclo di vita della pagina iniziale, vengono abbandonati nel post indietro?
Soluzione
Le pagine potrebbero avere EnableViewState = false su aspx
Potrebbe anche essere disabilitato sul web.config dell'applicazione o persino per il computer complessivo sull'elemento.
Aggiornamento 1: nel ciclo di vita di asp.net, ViewState viene caricato dopo Init e prima di Load maggiori informazioni . Vedilo come se qualsiasi cosa su init fosse considerata parte della dichiarazione della pagina. In seguito asp.net caricherà il viewstate e successivamente inizierà a tracciare le modifiche al viewstate. È dopo questo che asp.net vedrà alcuna differenza tra le informazioni iniziali su viewstate e le informazioni modificate, quindi spostarle per caricare evita il problema (poiché lo stato iniziale non è presente e il nuovo stato è qualunque cosa tu abbia inserito nel viewstate) . Dal link sopra:
" Il motivo è dovuto alla classe StateBag tiene traccia solo delle modifiche ai suoi membri dopo il suo metodo TrackViewState () ha stato invocato. Cioè, se hai un StateBag, eventuali aggiunte o modifiche apportate in precedenza TrackViewState () è stato creato non lo sarà salvato quando il metodo SaveViewState () viene invocato. TrackViewState () Il metodo viene chiamato alla fine di fase di inizializzazione, che succede dopo la fase di istanziazione. Pertanto, la proprietà iniziale incarichi nell'istanza stage — mentre è scritto su ViewState nei set di accessori delle proprietà — sono non persistito durante il Chiamata del metodo SaveViewState () in salvare lo stato di visualizzazione, perché il Il metodo TrackViewState () deve ancora essere . Invocato "
Altri suggerimenti
Ecco un'ottima risposta che un altro utente ha postato su Ciclo di vita della pagina ASP.NET vale la pena dare un'occhiata ai problemi di ViewState.
Inoltre, dai un'occhiata a " Capire veramente ViewState "
Come ho affermato nella parte che ho aggiunto in seguito, a quanto pare non è possibile impostare nulla nello stato di visualizzazione prima del caricamento della pagina, ANCHE ATTRAVERSO Asp.net non genera un errore ed esisterà nello stato di visualizzazione durante l'iniziale ciclo di vita della pagina, NON persisterà sul ciclo di vita del postback successivo.
Dai un'occhiata a dove stai impostando i valori di ViewState. Possibilmente collega il tuo evento OnUnload e ispeziona l'oggetto ViewState solo per assicurarti che i valori vengano effettivamente impostati.