2010-08-20 14 views
12

utilizo $ .ajax() para sondear un método de acción cada 5 segundos de la siguiente manera:

$.ajax({ 
    type: 'GET', url: '/MyController/IsReady/1', 
    dataType: 'json', success: function (xhr_data) { 
     if (xhr_data.active == 'pending') { 
      setTimeout(function() { ajaxRequest(); }, 5000);     
     } 
    } 
}); 

y la acción ActionResult:

public ActionResult IsReady(int id) 
{ 
    if(true) 
    { 
     return RedirectToAction("AnotherAction"); 
    } 
    return Json("pending"); 
} 

que tenía que cambiar el tipo de acción de retorno a ActionResult en Para usar RedirectToAction (originalmente era JsonResult y yo regresaba al Json(new { active = 'active' };), parece que tiene problemas para redireccionar y renderizar la nueva Vista desde dentro de la devolución de llamada exitosa de $ .ajax(). Necesito redireccionar a "AnotherAction" desde este voto de devolución de Ajax. La respuesta de Firebug es la vista desde "AnotherAction", pero no está renderizando.

Respuesta

15

Necesita consumir el resultado de su solicitud de Ajax y usar eso para ejecutar javascript y actualizar manualmente window.location usted mismo. Por ejemplo, algo como:

// Your ajax callback: 
function(result) { 
    if (result.redirectUrl != null) { 
     window.location = result.redirectUrl; 
    } 
} 

Donde "número" es el argumento pasado a usted por el método ajax de jQuery después de la finalización de la petición Ajax. (Y para generar la URL, use UrlHelper.GenerateUrl, que es un MVC helper que crea URLs basadas en acciones/controladores/etc.)

+0

encontró algo similar en otro post después de una búsqueda exhaustiva. la única diferencia fue que usó window.location.replace en su lugar. ¡Gracias! –

2

Sé que este es un artículo súper antiguo, pero después de recorrer la web este sigue siendo el respuesta superior en Google, y terminé usando una solución diferente. Si desea utilizar un RedirectToAction puro, esto también funciona. La respuesta RedirectToAction contiene el marcado completo de la vista.

C#:

return RedirectToAction("Action", "Controller", new { myRouteValue = foo}); 

JS:

$.ajax({ 
    type: "POST", 
    url: "./PostController/PostAction", 
    data: data, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    complete: function (result) { 
     if (result.responseText) { 
      $('body').html(result.responseText); 
     } 
    } 
}); 
0

C# funcionaron bien

acabo de cambiar la JS porque responseText no funcionaba para mí:

$.ajax({ 
     type: "POST", 
     url: posturl, 
     contentType: false, 
     processData: false, 
     async: false, 
     data: requestjson, 
     success: function(result) { 
      if (result) { 
       $('body').html(result); 
      } 
     }, 

     error: function (xhr, status, p3, p4){ 
      var err = "Error " + " " + status + " " + p3 + " " + p4; 
      if (xhr.responseText && xhr.responseText[0] == "{") 
       err = JSON.parse(xhr.responseText).Message; 
      console.log(err); 
     } 
    }); 
0

Usted podría utilizar el ayudante Html.RenderAction en una vista:

public ActionResult IsReady(int id) 
{ 
    if(true) 
    { 
     ViewBag.Action = "AnotherAction"; 
     return PartialView("_AjaxRedirect"); 
    } 
    return Json("pending"); 
} 

Y en el "_AjaxRedirect" vista parcial:

@{ 
    string action = ViewBag.ActionName; 
    Html.RenderAction(action); 
} 

Referencia: https://stackoverflow.com/a/49137153/150342

Cuestiones relacionadas