Redirection côté serveur après un appel jquery ajax dans asp.net mvc 4

J’envoie les informations de connexion d’un appel AJAX jQuery à un contrôleur MVC 4:

$.post(url, data, function (response) { if (response=='InvalidLogin') { //show invalid login } else if (response == 'Error') { //show error } else { //redirecting to main page from here for the time being. window.location.replace("http://localhost:1378/Dashboard/Index"); } }); 

Si la connexion aboutit, je souhaite redirect un utilisateur côté serveur vers la page appropriée en fonction du type d’utilisateur. Si la connexion échoue, une chaîne est renvoyée à l’utilisateur:

  [HttpPost] public ActionResult Index(LoginModel loginData) { if (login fails) { return Json("InvalidLogin", JsonRequestBehavior.AllowGet); } else { // I want to redirect to another controller, view, or action depending // on user type. } } 

Mais il y a des problèmes:

  1. Si cette méthode retourne ‘ActionResult’, j’obtiens l’erreur, not all code paths return a value .

  2. Si j’utilise ‘void’, je ne peux rien retourner.

  3. Même si j’utilise ‘void’ sans retour, je ne parviens pas à redirect vers un autre contrôleur ou une vue en raison de la nature asynchrone des appels jQuery AJAX.

Existe-t-il des techniques pour gérer de tels scénarios?

return retourne généralement à partir de la méthode sans exécuter d’autres instructions, donc une partie n’est pas nécessaire. De cette façon, vous vous débarrasserez d’un problème n ° 1.

En ce qui concerne la redirection, pourquoi ne pas renvoyer une sorte de commande de redirection :

 [HttpPost] public ActionResult Index(LoginModel loginData) { if (login fails) { return Json(new {result = "InvalidLogin"}, JsonRequestBehavior.AllowGet); } return Json(new {result = "Redirect", url = Url.Action("MyAction", "MyController")}); } 

Et puis en javascript:

 $.post(url, data, function (response) { if (response.result == 'InvalidLogin') { //show invalid login } else if (response.result == 'Error') { //show error } else if (response.result == 'Redirect'){ //redirecting to main page from here for the time being. window.location = response.url; } }); 

Cela m’aide.

 return JavaScript("window.location = '/'"); 

Réf. link Comment obtenir une réponse ASP.NET MVC Ajax à redirect vers une nouvelle page …

Je devais le faire, mais aucune des solutions que j’ai trouvées ne répondait vraiment à mes exigences extrêmes d’parsing d’erreur JavaScript que je devais éviter afin de redirect le client vers la page de connexion.

Ce que j’ai fait est d’envoyer une simple réponse “NOAUTH” à partir de mon atsortingbut d’autorisation personnalisé, puis d’intercepter la réponse Ajax avant que les gestionnaires d’événements ne soient touchés et de redirect l’utilisateur en définissant window.location.

Du côté serveur:

 protected override void HandleUnauthorizedRequest(AuthorizationContext context) { if (context.RequestContext.HttpContext.Request.IsAjaxRequest()) { var result = new ContentResult {Content = "NOAUTH"}; context.Result = result; return; } } 

Ensuite côté client:

 $.ajaxSetup({ dataFilter: function (data, type) { if (data !== "" && data === "NOAUTH") { window.location = '/'; } return data; } }); 

Je ne recommanderais pas cette approche cependant. Si vous devez faire cela, alors au moins, je suggérerais plutôt de placer la valeur “NOAUTH” dans l’en-tête de la réponse http, puis de lire la valeur dans un gestionnaire complet global JQuery.

Du côté serveur:

 HttpContext.Current.Response.AddHeader("NOAUTH", "1"); 

Côté client:

 $.ajaxSetup({ complete: function (jqXHR, textStatus) { if (jqXHR.getResponseHeader("NOAUTH") === '1') window.location = '/'; } }); 

Notez que l’utilisation de dataFilter est le seul moyen d’intercepter les demandes ajax avant que tous les autres gestionnaires d’événements ne soient touchés.