2011-09-08 6 views
5

Ho una dashboard che inizia in uno stato vuoto/predefinito. Sto dando all'utente la possibilità di caricare uno stato salvato nella dashboard. Quando si fa clic sul pulsante 'Applica' ho eseguire il seguente codice:Richiesto per il modulo di conferma Reinvia su aggiornamenti dopo il postback. Cosa sto facendo in modo errato?

function CloseAndSave() { 
    var radUpload = $find(radUpload1ID); 
    var inputs = radUpload.getFileInputs(); 

    if (inputs[0].value.length == 0) { 
     alert('Please select a dashboard to upload.'); 
     return; 
    } 

    if(!radUpload.isExtensionValid(inputs[0].value)) { 
     alert('Please select an XML file.'); 
     radUpload.clearFileInputAt(0); 
     return; 
    } 

    oWindow = null; 
    __doPostBack(radButton1ID); 
} 

protected void RadButton1_Click(object sender, EventArgs e) 
{ 
    if (RadUpload1.UploadedFiles.Count > 0) 
    { 
     UploadedFile dashboardXMLFile = RadUpload1.UploadedFiles[0]; 

     SerializableDictionary<string, string> dataToLoad = new SerializableDictionary<string, string>(); 
     XmlSerializer xmlSerializer = new XmlSerializer(dataToLoad.GetType()); 

     using (StreamReader reader = new StreamReader(dashboardXMLFile.InputStream)) 
     { 
      dataToLoad = (SerializableDictionary<string, string>)xmlSerializer.Deserialize(reader); 
     } 

     foreach (var entry in dataToLoad) 
     { 
      string sessionKey = entry.Key; 

      if (!string.IsNullOrEmpty(entry.Value)) 
      { 
       Type type = StateManager.GetTypeFromStateName(sessionKey); 

       byte[] data = Convert.FromBase64String(entry.Value); 
       using (MemoryStream memoryStream = new MemoryStream(data)) 
       { 
        xmlSerializer = new XmlSerializer(type); 
        SessionRepository.Instance.SetSession(sessionKey, xmlSerializer.Deserialize(memoryStream)); 
       } 
      } 
     } 
    } 
} 

RadButton1 ha la proprietà "AutoPostBack" impostato su false. Ho impostato AutoPostBack su false perché volevo eseguire la convalida prima di eseguire l'evento click. Quindi, ora eseguo la convalida sul lato client e quindi concedo il clic del pulsante per l'esecuzione.

Nessun riquadro di aggiornamento include RadButton1. In quanto tale, l'intera pagina post dopo RadButton1_Click. Ciò fa sì che lo stato della pagina "carichi" lo stato analizzato.

A questo punto, se aggiorno la pagina, Google Chrome dice "Conferma modulo di nuovo invio". Ho letto su come soffocare questo, ma preferirei rintracciare la causa principale.

Soluzione:

//This changes the response to a GET instead of a POST. Prevents the 'Form Resubmission' dialog. 
Page.Response.Redirect(Page.Request.Url.ToString(), true); 
+0

Ogni volta che una pagina viene inviata da un modulo POST, l'aggiornamento della pagina con il pulsante del browser (F5 o qualsiasi altra cosa) lo richiederà (dovrebbe). Questo è un comportamento normale. Devi schiacciarlo perché la causa principale è il normale comportamento del browser che ha lo scopo di impedire la re-invio accidentale di moduli che in realtà fanno qualcosa come inviare un pagamento. – Nikki9696

+0

Penso che se questi dati vengono reinviati silenziosamente accadranno cose brutte. Devo trovare un modo per cancellare i dati POST dopo che si è verificato. Sto leggendo su PRG attualmente. –

risposta

10

Quando si aggiorna il browser, verrà inviare nuovamente l'ultima richiesta che hai fatto. Se si trattava di una richiesta POST (come in caso di postback), quindi re-pubblicherà le informazioni ma prima di farlo vedrai il messaggio di avviso che descrivi.

Il modo migliore per evitare questo problema sta attuando il modello Post/Redirect/Get

Post/Redirect/Get (PRG) è un modello di progettazione comune per gli sviluppatori web per aiutare ad evitare alcuni invio di moduli duplicati e consentire agli interpreti di comportarsi in modo più intuitivo con i segnalibri e il pulsante di aggiornamento.

Normalmente le persone non implementano questo (anche se dovremmo) a meno che il re-post possa causare un'incoerenza di alcuni dati.

+0

Ehi, quindi ho fatto qualche lettura su questo, e sono confuso su come implementarlo. Conosci qualche esempio di ASP.NET AJAX? Ho fatto un po 'di ricerca su Google, ma la maggior parte del discorso è concettuale. Stavo pensando di andare all'evento OnResponseEnd di PageRequestManager e reindirizzare alla pagina quando rileva le condizioni appropriate. Suona ragionevole? –

+0

L'ho contrassegnato come una risposta alle preziose informazioni fornite, ma ho spostato la discussione in un nuovo post nel tentativo di ottenere ulteriori informazioni. Grazie! –

+0

@Sean Anderson: Sono un po 'confuso. Probabilmente non ho ottenuto molto bene la tua idea. Hai detto che RadButton1 ha inviato l'intera pagina senza usare AJAX. Quindi non sei sicuro del motivo per cui provi a coinvolgere PageRequestManager se la richiesta non coinvolge alcuna interazione ajax. –

0

Quando si aggiorna il browser, verrà inviata nuovamente l'ultima richiesta effettuata. Se si trattava di una richiesta POST (come in caso di postback), quindi re-pubblicherà le informazioni ma prima di farlo vedrai il messaggio di avviso che descrivi.