Saltar al contenido

Cómo administrar una solicitud de redirección después de una llamada jQuery Ajax

Lucía, miembro de este gran staff, nos hizo el favor de escribir esta reseña porque controla muy bien este tema.

Solución:

Leí esta pregunta e implementé el enfoque que se ha establecido con respecto a establecer la respuesta. Código de estado HTTP a 278 para evitar que el navegador maneje las redirecciones de forma transparente. Aunque esto funcionó, estaba un poco insatisfecho porque es un truco.

Después de investigar más, abandoné este enfoque y usé JSON. En este caso, todas las respuestas a las solicitudes de AJAX tienen la código de estado 200 y el cuerpo de la respuesta contiene un objeto JSON que se construye en el servidor. El JavaScript en el cliente puede usar el objeto JSON para decidir qué debe hacer.

Yo tuve un problema similar al tuyo. Realizo una solicitud AJAX que tiene 2 respuestas posibles: una que redirecciones el navegador a una nueva página y una que reemplaza un formulario HTML existente en la página actual con uno nuevo. El código jQuery para hacer esto se parece a:

$.ajax(
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) 
        if (data.redirect) 
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
         else 
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        
    
);

El objeto JSON “datos” se construye en el servidor para tener 2 miembros: data.redirect y data.form. Encontré que este enfoque es mucho mejor.

Resolví este problema por:

  1. Agregar un encabezado personalizado a la respuesta:

    public ActionResult Index()
        if (!HttpContext.User.Identity.IsAuthenticated)
        
            HttpContext.Response.AddHeader("REQUIRES_AUTH","1");
        
        return View();
    
    
  2. Vincular una función de JavaScript a la ajaxSuccess event y comprobando si existe el encabezado:

    $(document).ajaxSuccess(function(event, request, settings) 
        if (request.getResponseHeader('REQUIRES_AUTH') === '1') 
           window.location = '/';
        
    );
    

Ningún navegador maneja correctamente las respuestas 301 y 302. Y, de hecho, el estándar incluso dice que deben manejarlos “de manera transparente”, lo cual es un ENORME dolor de cabeza para los proveedores de la Biblioteca Ajax. En Ra-Ajax nos vimos obligados a usar la respuesta HTTP código de estado 278 (solo un código de éxito “no utilizado”) para manejar redireccionamientos transparentes desde el servidor…

Esto realmente me molesta, y si alguien aquí tiene algún “tirón” en W3C, agradecería que pudiera dejar que W3C saber que realmente necesitamos manejar los códigos 301 y 302 nosotros mismos…! 😉

Comentarios y puntuaciones del artículo

Si te apasiona la informática, tienes la libertad de dejar una crónica acerca de qué le añadirías a este tutorial.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *