2010-04-20 7 views
20

Je suis assez nouveau pour MVC, mais ne sais pas exactement qui redirigent ... remplace la redirection standard utilisé dans la norme WebForms-à-dire Response.Redirect()ASP.NET MVC: Quelle est la bonne façon de rediriger vers des pages/actions dans MVC?

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

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

2) Dans un événement contrôleur ou la base du contrôleur par exemple Initialize, je veux rediriger vers une autre page (AbsoluteRootUrl + Controller + Action)

Il semble que plusieurs redirections s'appelle dans certains cas, ce qui provoque des erreurs, quelque chose à faire avec le fait qu'une page est déjà en cours de redirection? Comment annuler la demande en cours et rediriger simplement?

Mise à jour:

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

Un commentaire sur pourquoi Initialize ne devrait pas être utilisé ou pourquoi OnAuthorization n'est pas une meilleure option?

Plus d'info:

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 d'ajouter ceci à cet événement dans la classe de base de contrôleur est très bien tous les page exécute une action dans MVC, donc cela ne devrait pas faire beaucoup de différence et avoir la possibilité de rediriger devrait être plus facile. Cela a du sens, mais il me semble aussi logique que des choses puissent être faites dans un événement avant cet événement et que nous nous demandions à quoi ces événements sont destinés? RENONCEZ OnActionExecuting un go ..

+0

Qu'est-ce que ce contrôleur de base initialiser l'événement que vous avez mentionné? –

+0

@Mahesh Velaga: J'ai un contrôleur de base qui remplace l'événement Initialize ie protected override void Initialize (System.Web.Routing.RequestContext requestContext) ... J'ai des contrôles de sécurité et j'ai besoin de rediriger les utilisateurs sur la base de ces contrôles –

+0

Pourquoi ne pas définir certaines valeurs dans tempdata ou viewdata et lorsque vous atteignez l'action du contrôleur en fonction de la valeur que vous pouvez rediriger à l'aide de RedirectToAction? –

Répondre

19

1) Lorsque l'utilisateur se déconnecte (Forms signout en action) Je veux rediriger vers une page de connexion.

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

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

Pourquoi voudriez-vous rediriger à partir d'une initialisation du contrôleur?

le moteur de routage gère automatiquement les demandes qui viennent, si vous voulez dire que vous souhaitez rediriger de l'action de l'index sur un contrôleur simplement:

public ActionResult Index() { 
    return RedirectToAction("whateverAction", "whateverController"); 
} 
+0

Pourrait vouloir noter que le premier élément est dans le contrôleur de compte. – GalacticCowboy

+0

Je pense toujours que l'utilisation de FormsAuthentication.RedirectToLoginPage() doit être utilisé à la place de return RedirectToAction ("Login"); –

+0

L'événement Controller initialize détecte des sous-domaines pour un hébergement multiclient, détecte les modifications de sous-domaine et vérifie également l'authentification de l'utilisateur. –

2
RedirectToAction("actionName", "controllerName"); 

Il a d'autres aussi bien les surcharges, s'il vous plaît vérifier up!

Aussi, si vous êtes nouveau et que vous n'utilisez pas T4MVC, alors je vous recommande de l'utiliser!

Il vous donne intellisence des actions, contrôleurs, vues, etc (pas plus de cordes magiques)

+0

Ceci est bon pour le numéro 1, mais vous ne l'avez pas disponible dans le numéro 2. –

+0

En effet, dans cas numéro 2, le RedirectToAction semble être ignoré? –

4

1) Pour rediriger vers la page de connexion/de la page de connexion, ne pas utiliser les méthodes Redirect(). Utilisez FormsAuthentication.RedirectToLoginPage() et FormsAuthentication.RedirectFromLoginPage()!

2) Vous devriez simplement utiliser RedirectToAction ("action", "controller") dans les scénarios habituels. Vous voulez rediriger en side la méthode Initialize? Pourquoi? Je ne vois pas pourquoi voudriez-vous jamais faire cela, et dans la plupart des cas, vous devriez revoir votre approche imo ..Si vous voulez faire pour l'authentification c'est vraiment dans le mauvais sens (avec très peu de chances Foe une exception) Utilisez l'attribut [Authorize] sur votre contrôleur ou la méthode à la place :)

UPD: si vous avez une certaine sécurité contrôles dans la méthode Initialiser, et l'utilisateur n'a pas accès à cette méthode, vous pouvez faire deux choses: a)

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

ce enverrez l'utilisateur à la page de connexion. Si vous souhaitez l'envoyer à 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()); 
+0

Il existe une vérification d'authentification, mais il s'agit plus de vérifier un utilisateur contre un locataire dans une application multiclient et d'autres vérifications de sécurité sont effectuées. S'il y a une violation, l'utilisateur devrait être déconnecté et redirigé quelque part (cela pourrait être un login générique, un login spécifique, une page d'accueil ou une autre page) –

+0

Eh bien .. Ma réponse semble couvrir ça, non? Sauf si j'ai manqué quelque chose, auquel cas je serai heureux de vous aider) –

+0

Les redirections ne semblent pas fonctionner du tout initialiser, donc ayant une refonte ... ajouter plus d'info à la question ... –

Questions connexes