2010-05-27 14 views
7

Io uso jquery per postare un'azione di controller MVC che restituisce una tabella di informazioni. L'utente della pagina attiva questo facendo clic su vari collegamenti.Perché la chiamata abort() su una richiesta jax causa un errore in ASP.Net MVC (IE8)

Nel caso in cui l'utente decida di fare clic su un gruppo di questi collegamenti in rapida successione, ho voluto annullare qualsiasi richiesta di ajax precedente che potrebbe non essere stata completata.

Ho scoperto che quando faccio questo (anche se la sua multa da POV del cliente) mi metterò errori sulla applicazione web dicendo che

"The parameters dictionary contains a null entry for parameter srtCol of non-nullable type 'System.Int32'"

Ora il palo ajax passa attimo in tutta la parametri, e se non provo a cancellare la richiesta di ajax funziona bene.

Ma se annullo la richiesta chiamando abort() sull'oggetto XMLHttpRequest che ajax() restituisce prima che finisca, ottengo l'errore da ASP.Net MVC.

Esempio:

//Cancel any pevious request 
if (req) 
{ 
    req.abort(); 
    req = null; 
} 

//Make new request 
req = $.ajax({ 
    type: 'POST', 
    url: "/Myapp/GetTbl", 
    data: {srtCol: srt, view: viewID}, 
    success: OnSuccess, 
    error: OnError, 
    dataType: "html" 
}); 

ho notato questo accada solo è IE8. In FF non sembra un problema.

Qualcuno sa come annullare una richiesta Ajax in IE8 senza causare errori per MVC?

Grazie per qualsiasi aiuto.

risposta

3

IE potrebbe inviare parte del corpo della richiesta al server prima di interrompere, fornendo al server una richiesta sufficiente per avviare l'elaborazione, ma non tutti i parametri necessari. È possibile controllare questo osservando l'attività di IE in un proxy (come fiddler) --- se si ottiene parte della richiesta, quindi IE sta gestendo male lo abort(). In questo caso, potresti voler lasciare che la vecchia richiesta AJAX termini e impedire semplicemente che OnSuccess esegua qualcosa, piuttosto che interromperlo.

EDIT:

var req; // current/latest request 

var OnSuccess = function(data, textStatus, XMLHttpRequest) { 
    if (XMLHttpRequest != req) return; 
    // latest request has succeeded 
} 

req = $.ajax(...); 

tenere un riferimento all'ultima richiesta, come si fa adesso, ma non abortire. Invece, OnSuccess verifica se l'oggetto di richiesta passato ad esso è uguale alla "ultima richiesta"; se sono diversi, è intervenuta un'altra richiesta, e passa.

+0

Ho il sospetto che tu abbia ragione. Ma non sono sicuro di come riscrivere il mio codice JS in modo che OnSuccess venga ignorato per la richiesta interrotta, ma viene eseguito per richieste non interrotte. Puoi farmi un esempio? – user169867

+0

Mi piace. Penso che funzionerà. Grazie mille! – user169867

+0

Nessun problema! Spero che funzioni. – kevingessner

Problemi correlati