2009-08-20 12 views
6

Sono relativamente nuovo nello sviluppo di Web. & ASP.Net, quindi portami con me. Durante il test delle nostre pagine Web, ho notato che se un utente faceva clic su "Aggiorna/Ricarica" ​​e fa clic su "Riprova" quando viene richiesto nella finestra di dialogo "Rinvia informazioni", qualunque sia l'ultimo evento che è stato generato prima che l'utente scelga a "Aggiorna", verrà successivamente eseguito di nuovo.
Ad esempio, abbiamo pulsanti "Precedente" e "Avanti", che consentono all'utente di navigare attraverso una serie di domande. Se l'operatore dovesse premere "Aggiorna/Ricarica", il pulsante di Nav che l'utente ha premuto per ultimo sparerà di nuovo. Questo in realtà ha un senso, ma l'effetto netto è che l'utente finisce sulla pagina successiva o precedente da cui stava guardando in precedenza. C'è un lavoro in giro per questo genere di cose?Refreshing/Ricarica effetto collaterale con ASP.net?

+0

Vedere: http://stackoverflow.com/questions/743580/page-refresh-causes-duplicate-post-in-asp-net-applications – Shog9

risposta

4

Ciò è dovuto al modo in cui si gestisce PostBacks.

Un po 'di storia è necessaria:

Il web è "senza stato", che significa che ogni richiesta da un client a un server è indipendente dalla richiesta prima che o la richiesta dopo di esso. Non esiste uno "stato" mantenuto. Se si guarda il livello HTTP, è semplicemente un blob di testo inviato al server che dice "inviami queste informazioni" e il server lo rimanda. Non c'è "Io sono lo stesso utente che era qui 3 minuti fa e vorrei passare alla pagina successiva da quella che ero l'ultima volta che abbiamo parlato".

Il modo in cui ASP.NET risolve questo problema sta utilizzando ViewState e postback. Ogni volta che fai clic su un pulsante ASP.NET, in realtà sta inviando un modulo che ha un campo nascosto con un gruppo di dati codificati. Questo dato contiene tutte le informazioni del server per "ricostruire" lo stato della pagina come se fosse l'ultima volta. Quindi può eseguire il "passaggio alla pagina successiva" e tale comando ha senso. Quando ASP.NET rimanda l'HTML al client, aggiorna quel campo nascosto con nuovi dati, rappresentando nuovamente lo stato della pagina, come è adesso. E la volta successiva che fai clic su un pulsante qualsiasi, i dati vengono inviati di nuovo, la pagina viene ricostruita di nuovo e il ciclo si ripete.

Quando l'utente fa clic su "Aggiorna", il browser chiede loro se desiderano inviare di nuovo il modulo. Stanno inviando nuovamente gli stessi dati che hanno fatto l'ultima volta.

Implicazioni per voi:

Se si tenta di tenere traccia di tutti i dati relativi all'utente o che cosa stanno facendo indipendentemente dalla ASP.NET ViewState, che sarà necessario per assicurarsi che si sincronizzano che ogni volta che la pagina processi.

Probabilmente si desidera mantenere la "pagina corrente" nel ViewState:

ViewState.Add("CurrentPage", intCurrentPage); 

Così, quando si chiama il gestore MoveNext eventi, si può essere sicuri che si sta spostando relativi alla pagina come è stato l'ultima volta è stato inviato al cliente.

+0

Grazie mille, molto utile. –

1

Si potrebbe guardare verso il pattern Post-Redirect-Get che è più comunemente usato in asp.net mvc.

Vedere here per ulteriori dettagli.

+0

Questa è una buona tecnica per mitigare i nuovi invii di moduli, ma non sono sicuro se sarebbe una buona idea usarla per quella che è essenzialmente ogni richiesta in un'app WebForms altamente statica. Questo raddoppia il numero di richieste a livello di applicazione. –

+0

L'OP non ha menzionato nulla di "altamente statico", è solo una tua supposizione e, a meno che non abbia> 200 richieste al secondo, la sua infrastruttura difficilmente noterebbe il viaggio di andata e ritorno. Per sbarazzarsi di quei dialoghi e pericoli di ripresentazione vale la pena di lavorare in più. – redsquare

+0

Se si nota che SO utilizza la stessa tecnica. Non vedo molti problemi di perfusione qui, e viene rilevato più volte al secondo! – redsquare

Problemi correlati