2010-08-20 10 views
12

Io uso $ .ajax() per interrogare un metodo di azione ogni 5 secondi come segue:

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

e l'azione ActionResult:

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

ho dovuto cambiare il tipo di ritorno azione da ActionResult in per utilizzare RedirectToAction (originariamente era JsonResult e stavo restituendo Json(new { active = 'active' };), ma sembra avere problemi a reindirizzare e rendere la nuova vista all'interno della chiamata di successo $ .ajax(). Devo reindirizzare a "AnotherAction" all'interno di questo postback ajax di polling. La risposta di Firebug è la vista di "AnotherAction", ma non è rendering.

risposta

15

È necessario consumare il risultato della richiesta ajax e utilizzarlo per eseguire javascript per aggiornare manualmente window.location. Ad esempio, qualcosa come:

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

Dove "risultato" è l'argomento passato a voi con il metodo ajax di jQuery dopo il completamento della richiesta Ajax. (E per generare l'URL stesso, usa UrlHelper.GenerateUrl, che è un helper MVC che crea URL basati su azioni/controller/ecc.)

+0

trovato qualcosa di simile su un altro post dopo una ricerca esauriente. l'unica differenza era che utilizzava invece window.location.replace. Grazie! –

2

So che questo è un articolo super vecchio ma dopo aver setacciato il web questo era ancora il risposta migliore su Google e ho finito per utilizzare una soluzione diversa. Anche se si desidera utilizzare una RedirectToAction pura, questo funziona allo stesso modo. La risposta di RedirectToAction contiene il markup completo per 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# hanno lavorato bene

Ho appena cambiato il JS perché responseText non funzionava per me:

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

È possibile utilizzare il Html.RenderAction aiutante in una vista:

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

E nel "_AjaxRedirect" visione parziale:

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

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

Problemi correlati