2010-08-20 14 views
12

J'utilise .ajax $() pour interroger une méthode d'action toutes les 5 secondes comme suit:

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

et l'action ActionResult:

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

je devais changer le type de retour d'action à ActionResult en Afin d'utiliser RedirectToAction (à l'origine, c'était JsonResult et je retournais Json(new { active = 'active' };), mais il semble avoir du mal à rediriger et rendre la nouvelle vue depuis le rappel de succès $ .ajax(). J'ai besoin de rediriger vers "AnotherAction" à partir de cette publication ajax interrogation. La réponse de Firebug est la vue de "AnotherAction", mais ce n'est pas le rendu.

Répondre

15

Vous devez consommer le résultat de votre requête ajax et l'utiliser pour exécuter javascript afin de mettre à jour manuellement window.location. Par exemple, quelque chose comme:

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

Où « résultat » est l'argument passé à vous par la méthode ajax jQuery après la fin de la demande ajax. (Et pour générer l'URL elle-même, utilisez UrlHelper.GenerateUrl, qui est une aide MVC qui crée des URL basées sur des actions/contrôleurs/etc.)

+0

trouvé quelque chose de similaire sur un autre poste après une recherche exhaustive. la seule différence était qu'elle utilisait window.location.replace à la place. Merci! –

2

Je sais que c'est un article super vieux, mais après avoir parcouru le web c'était toujours le top réponse sur Google, et j'ai fini par utiliser une solution différente. Si vous voulez utiliser un RedirectToAction pur, cela fonctionne aussi. La réponse RedirectToAction contient le balisage complet pour la vue.

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# ont bien fonctionné

Je viens de changer la JS parce responseText ne fonctionnait pas pour moi:

$.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

Vous pouvez utiliser le Html.RenderAction aide dans une vue:

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

Et dans la vue partielle "_AjaxRedirect":

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

Référence: https://stackoverflow.com/a/49137153/150342