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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top