2010-05-27 15 views
7

Utilizo jquery para publicar en una acción del controlador MVC que devuelve una tabla de información. El usuario de la página activa esto haciendo clic en varios enlaces.¿Por qué la llamada abort() en la solicitud ajax causa un error en ASP.Net MVC (IE8)

En el caso de que el usuario decida hacer clic en un grupo de estos enlaces en rápida sucesión, quería cancelar cualquier solicitud anterior de Ajax que no haya finalizado.

He descubierto que cuando hago esto (aunque su fina del POV del cliente) que se producirán errores en la aplicación web diciendo que

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

Ahora el puesto ajax pasa duda alguna en toda la parámetros, y si no intento y cancelo la solicitud de Ajax, funciona bien.

Pero si cancelo la solicitud llamando a abort() en el objeto XMLHttpRequest que devuelve ajax() antes de que termine, recibo el error de ASP.Net MVC.

Ejemplo:

//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" 
}); 

me he dado cuenta que esto sólo sucede es IE8. En FF parece que no es un problema.

¿Alguien sabe cómo cancelar una solicitud de Ajax en IE8 sin causar errores para MVC?

Gracias por cualquier ayuda.

Respuesta

3

IE podría estar enviando parte del cuerpo de la solicitud al servidor antes de abortar, lo que le da al servidor suficiente solicitud para iniciar el procesamiento, pero no todos los parámetros que necesita. Puede verificar esto mirando la actividad de IE en un proxy (como fiddler) --- si obtiene parte de la solicitud, entonces IE está manejando el abort() mal. Si ese es el caso, es posible que desee dejar que la antigua solicitud AJAX finalice, y solo evitar que OnSuccess haga algo, en lugar de abortarla.

EDIT:

var req; // current/latest request 

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

req = $.ajax(...); 

mantener una referencia a la última solicitud, como lo hace ahora, pero no abortar. En cambio, OnSuccess comprueba si el objeto de solicitud que se le pasa es el mismo que la "última solicitud"; si son diferentes, otra solicitud ha intervenido y se aprueba.

+0

Sospecho que tienes razón. Pero no estoy seguro de cómo reescribir mi código JS para que OnSuccess se ignore para la solicitud abortada pero se ejecute para solicitudes no anuladas. ¿Podrías darme un ejemplo? – user169867

+0

Me gusta. Creo que eso funcionará ¡Muchas gracias! – user169867

+0

¡Ningún problema! Espero que funcione. – kevingessner

Cuestiones relacionadas