web-dev-qa-db-fra.com

ASP.NET MVC: Quelle est la bonne façon de rediriger vers des pages / actions dans MVC?

Je suis assez nouveau sur MVC mais je ne sais pas exactement quelle redirection ... remplace la redirection standard utilisée dans WebForms, c'est-à-dire la norme Response.Redirect()

Par exemple, je dois rediriger vers d'autres pages dans quelques scénarios:

1) Lorsque l'utilisateur se déconnecte (déconnexion des formulaires en action), je souhaite rediriger vers une page de connexion.

2) Dans un événement Controller ou Controller de base, par exemple Initialize, je souhaite rediriger vers une autre page (AbsoluteRootUrl + Controller + Action)

Il semble que plusieurs redirections soient appelées dans certains cas, ce qui provoque des erreurs, quelque chose à voir avec le fait qu'une page est déjà redirigée? Comment peut annuler la demande actuelle et simplement rediriger?

Mise à jour:

La réponse à cette question ( System.Web.Mvc.Controller Initialize ) indique que Initialize ne doit pas être utilisé et OnActionExecuting doit être utilisé?

Des commentaires sur la raison pour laquelle Initialize ne devrait pas être utilisé ou pourquoi OnAuthorization n'est pas une meilleure option?

Plus d'informations:

Ce billet de blog ( http://blog.wekeroad.com/blog/aspnet-mvc-securing-your-controller-actions/ ) indique que OnActionExecuting est utile pour l'authentification (comme indiqué dans le lien ci-dessus) Je suppose que l'ajout de cet événement dans la classe Controller de base est correct car chaque page exécute une action dans MVC, cela ne devrait donc pas faire beaucoup de différence et avoir la possibilité de rediriger devrait être plus facile. Cela a du sens, mais il me semble également logique que les choses puissent être faites dans un événement avant cet événement et nous amène à nous demander à quoi servent ces événements? Va essayer OnActionExecuting ..

28
Mark Redman

1) Lorsque l'utilisateur se déconnecte (déconnexion des formulaires en action), je souhaite rediriger vers une page de connexion.

public ActionResult Logout() {
    //log out the user
    return RedirectToAction("Login");
}

2) Dans un événement Controller ou Controller de base, par exemple Initialze, je souhaite rediriger vers une autre page (AbsoluteRootUrl + Controller + Action)

Pourquoi voudriez-vous rediriger depuis une init de contrôleur?

le moteur de routage gère automatiquement les demandes qui arrivent, si vous voulez rediriger depuis l'action d'indexation sur un contrôleur, faites simplement:

public ActionResult Index() {
    return RedirectToAction("whateverAction", "whateverController");
}
24
Jimmy

1) Pour rediriger vers la page de connexion/à partir de la page de connexion, n'utilisez pas les méthodes Redirect (). Utilisez FormsAuthentication.RedirectToLoginPage() et FormsAuthentication.RedirectFromLoginPage()!

2) Vous devez simplement utiliser RedirectToAction ("action", "contrôleur") dans les scénarios réguliers. Vous voulez rediriger en parallèle la méthode Initialize? Pourquoi? Je ne vois pas pourquoi voudriez-vous faire cela, et dans la plupart des cas, vous devriez revoir votre approche imo. les [Authorize] attribut à la place sur votre contrôleur ou méthode :)

PD: si vous avez des contrôles de sécurité dans la méthode Initialise, et que l'utilisateur n'a pas accès à cette méthode, vous pouvez faire quelques choses: a)

Response.StatusCode = 403;
Response.End();

Cela renverra l'utilisateur à la page de connexion. Si vous voulez l'envoyer vers un emplacement personnalisé, vous pouvez faire quelque chose comme ça (cautios: pseudocode)

Response.Redirect(Url.Action("action", "controller"));

Pas besoin de spécifier l'URL complète. Cela devrait suffire. Si vous insistez complètement sur l'URL complète:

Response.Redirect(new Uri(Request.Url, Url.Action("action", "controller")).ToString());
5
Artiom Chilaru
RedirectToAction("actionName", "controllerName");

Il a également d'autres surcharges, veuillez vérifier!

De plus, si vous êtes nouveau et que vous n'utilisez pas T4MVC , alors je vous recommanderais de l'utiliser!

Il vous donne l'intellisence pour les actions, les contrôleurs, les vues, etc. (plus de chaînes magiques)

2
Mahesh Velaga