2010-05-19 3 views
23

Je enregistrements pour un aller chercher l'utilisateur en fonction de son UserId comme JsonResult ...Comment rediriger vers une action de contrôleur à partir d'une méthode JSONResult dans ASP.NET MVC?

public JsonResult GetClients(int currentPage, int pageSize) 
{ 
    if (Session["UserId"] != "") 
    { 
     var clients = clirep.FindAllClients().AsQueryable(); 
     var count = clients.Count(); 
     var results = new PagedList<ClientBO>(clients, currentPage - 1, pageSize); 
     var genericResult = new { Count = count, Results = results }; 
     return Json(genericResult); 
    } 
    else 
    { 
     //return RedirectToAction("Index","Home"); 
    } 
} 

Comment rediriger à une action de commande à partir d'une méthode JsonResult en asp.net mvc? Toute suggestion ...

EDIT: cela ne semble pas fonctionner ...

if (Session["UserId"] != "") 
      { 
       var clients = clirep.FindAllClients().AsQueryable(); 
       var count = clients.Count(); 
       var results = new PagedList<ClientBO>(clients, currentPage - 1, pageSize); 
       var genericResult = new { Count = count, Results = results ,isRedirect=false}; 
       return Json(genericResult); 
      } 
      else 
      { 
       return Json({redirectUrl = Url.Action("Index", "Home"), isRedirect = true }); 
      } 

Répondre

53

Cela dépendra de la façon dont vous invoquez cette action du contrôleur. Comme vous utilisez JSON, je suppose que vous l'appelez en AJAX. Si tel est le cas, vous ne pouvez pas rediriger depuis l'action du contrôleur. Vous devrez le faire dans le rappel success du script AJAX. Une façon d'y parvenir est la suivante:

return Json(new 
{ 
    redirectUrl = Url.Action("Index", "Home"), 
    isRedirect = true 
}); 

Et dans le rappel de succès:

success: function(json) { 
    if (json.isRedirect) { 
     window.location.href = json.redirectUrl; 
    } 
} 

Remarque: Assurez-vous d'inclure isRedirect = false dans le JSON au cas où vous ne voulez pas rediriger ce qui est le premier cas dans votre action de contrôleur.

+0

J'utilise jquery.ajax() ... –

+1

'redirectUrl' n'existe pas dans le contexte actuel ... –

+0

Je redirige avec AJAX tout le temps, mais lors de l'utilisation de collections de champs de formulaire publiées, pas lors de l'utilisation de JSON. En fait, j'essaie de repérer un bug impliquant la redirection avec des données publiées par JSON en ce moment: http://stackoverflow.com/questions/4110889/asp-net-mvc-2-losing-authorization-when-redirecttoaction- with-json-data On dirait que ce n'est pas quelque chose que je peux faire alors, ouais? – kdawg

0

pas moyen de ce faire, le client est l'exécution d'un script AJAX ne sera donc pas en mesure t o gérer tout autre chose.

Je vous suggère de rediriger dans le script client en fonction des données renvoyées dans la fonction de rappel.

Jetez un oeil à une question similaire ici: http://bytes.com/topic/javascript/answers/533023-ajax-redirect

2

Que pensez-vous d'essayer d'appeler:

return (new YourOtherController()).JSONResultAction(); 

au lieu d'utiliser des redirections?

3

Ajout à la réponse de Darin Dimitrov. Pour C# .NET MVC - Si vous voulez rediriger vers une page/un contrôleur différent et que vous voulez envoyer un objet/modèle au nouveau contrôleur, vous pouvez faire quelque chose comme ça.

Dans la méthode JsonResult (dans le contrôleur):

ErrorModel e = new ErrorModel(); 
      e.ErrorTitle = "Error"; 
      e.ErrorHeading = "Oops ! Something went wrong."; 
      e.ErrorMessage = "Unable to open Something"; 



return Json(new 
{ 
    redirectUrl = Url.Action("Index", "Home",e), 
    isRedirect = true 
}); 

Et dans le rappel de succès:

success: function(json) { 
    if (json.isRedirect) { 
     window.location.href = json.redirectUrl; 
    } 
} 

Et si le nouveau contrôleur peut accepter le modèle/objet comme ci-dessous .. vous peut transmettre l'objet au nouveau contrôleur/page

public ActionResult Index(ErrorModel e) 
    { 
     return View(e); 
    } 

Espérons que cela aide.

1

Et si vous travaillez avec des zones ...

Controller:

return Json(new 
     { 
      redirectUrl = Url.Action("Index", "/DisparadorProgSaude/", new { area = "AreaComum" }), 
      isRedirect = true 
     }); 

Vue:

success: function (json) { 

          if (json.isRedirect) { 
          window.location.href = json.redirectUrl; 
          } 
         }, 
Questions connexes