2011-09-13 8 views
5

Dans le contexte de ASP.net MVC3, j'ai cette ligne de code dans une action du contrôleur, qui tente de rediriger vers une URL particulière.Redirection (url) ne fonctionne pas

return Redirect(returnUrl); 

returnUrl est une chaîne contenant "/ Home/Index /". Pour une raison quelconque, la redirection n'a pas lieu et je reste sur le même écran. J'ai essayé d'enlever le slash final mais pas de succès. Des idées pour lesquelles la redirection n'a pas lieu?

Répondre

13

La méthode Redirect est destinée à être utilisée pour rediriger vers des URL externes de votre site et en lui transmettant une URL absolue. Si vous avez besoin de rediriger vers une autre action du contrôleur qui appartient à votre site, il serait préférable d'utiliser ceci:

return RedirectToAction("Index", "Home"); 

De cette façon, vous n'êtes plus hardcoding urls et votre code est moins fragile aux changements d'itinéraire. Cela étant dit, si vous appelez l'action du contrôleur qui effectue cette redirection avec AJAX, vous ne pouvez pas vous attendre à ce qu'il redirige le navigateur n'importe où => il restera évidemment sur la même page. La requête AJAX réussira après toutes les redirections et dans le rappel de succès, vous obtiendrez le code HTML final de l'URL /Home/Index comme si elle était demandée sans AJAX.

Si vous souhaitez rediriger dans le rappel de la réussite d'un appel AJAX vous pourriez avoir votre retour d'action du contrôleur par exemple un objet JSON indiquant l'URL cible que vous souhaitez rediriger vers:

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

et dans votre rappel utilisez la fonction window.location.href:

success: function(result) { 
    window.location.href = result.redirectToUrl; 
} 
+0

d'abord merci pour cette réponse exhaustive. Je n'utilise pas AJAX ici, donc nous pouvons exclure la deuxième partie de votre réponse. Idéalement, j'aimerais utiliser RedirectToAction() mais j'utilise Authentication ici, où j'obtiens returnUrl comme page demandée initialement. Cette demande d'origine peut être n'importe quelle page de mon application. Je ne peux donc pas coder en dur le contrôleur et l'action dans RedirectToAction(). Il y a une option pour moi de calculer la partie Controller et Action de returnUrl en utilisant des techniques de manipulation de chaînes (même si cela serait très difficile) mais je cherchais un meilleure solution. – Jatin

+0

@Nirvan, au lieu d'envoyer une variable de chaîne returnUrl envoyer 2 variables qui sont contrôleur et action. De cette façon, vous pouvez créer l'URL requise. Si ce n'est pas le cas, essayez d'utiliser une URL absolue avec Redirect comme 'http: // yoursite.com/home/index'. –

+0

@Darain, Désolé je n'étais pas très clair sur les choses d'authentification. L'authentification asp.net par défaut conserve la trace de la page initialement demandée avant la connexion. Je ne peuple pas moi-même le retour. Par exemple, supposons que l'utilisateur tente d'accéder à/Home/Index avant de se connecter. L'authentification Asp.net intervient et redirige vers la page de connexion de mon application. C'est ici que le serveur remplit le fichier returnUrl en tant que "/ Home/Index".Donc, vous voyez que je n'ai qu'une chaîne (regurnUrl) dans mon contrôleur de connexion qui contient l'URL de la page initialement demandée. – Jatin

2

Si vous êtes coincé sur le même écran LOGIN après avoir fourni les informations de connexion valides, il est possible que vous ne définissez pas le cookie d'authentification de formulaires.

Chaque fois que vous utilisez Redirect ou RedirectToLocal votre login actionmethods, assurez-vous que vous appelez dans l'ordre suivant:

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
return RedirectToLocal(returnUrl); 

Cela garantit, le cookie est avant Réorientation, sinon le client traitera comme si l'utilisateur est pas connecté.

Merci