2010-04-20 5 views
20

Ich bin ziemlich neu in MVC aber nicht sicher, genau die Redirect ... die Standard-Umleitung in WebForms, dh die Standard-Response.Redirect()ASP.NET MVC: Was ist die richtige Methode, um auf Seiten/Aktionen in MVC umzuleiten?

Zum Beispiel verwendet ersetzt, muß ich andere Seiten in ein paar Szenarien umleiten:

1) Wenn sich der Benutzer abmeldet (Formular-Abmeldung in Aktion), möchte ich auf eine Anmeldeseite umleiten.

2) in einem Controller oder Base-Controller Ereignis zB Initialize, möchte ich auf eine andere Seite (AbsoluteRootUrl + Controller + Aktion)

Es scheint umleiten, dass mehrere Umleitungen in einigen Fällen aufgerufen, die Fehler verursacht, etwas zu tun mit der Tatsache, dass eine Seite bereits umgeleitet wird? Wie kann ich die aktuelle Anfrage abbrechen und nur weiterleiten?

Update:

Die Antwort auf diese Frage (System.Web.Mvc.Controller Initialize) gibt an, dass Initialize sollte nicht verwendet werden und OnActionExecuting verwendet werden sollte?

Alle Kommentare, warum Initialize nicht verwendet werden sollte oder warum OnAuthorization ist nicht eine bessere Option?

Mehr Info:

Dieser Blog-Eintrag (http://blog.wekeroad.com/blog/aspnet-mvc-securing-your-controller-actions/) zeigt an, dass OnActionExecuting zur Authentifizierung nützlich ist (wie in den Link oben angegeben) ich dies in der Basis Controller-Klasse zu diesem Ereignis erraten Zugabe ist als jede feine Seite führt eine Aktion in MVC aus, sollte also keinen großen Unterschied machen und die Möglichkeit zum Umleiten sollte einfacher sein. Das macht Sinn, aber es scheint mir auch sinnvoll zu sein, dass Dinge in einem Event vor diesem Event gemacht werden könnten und lässt uns fragen, wofür diese Events sind? Wird geben OnActionExecuting ein zu gehen ..

+0

Was ist das Basis-Controller initialisieren Ereignis, das Sie erwähnt haben? –

+0

@Mahesh Velaga: Ich habe Basis-Controller, die das Initialize-Ereignis überschreibt, dh geschützte Überschreibung void Initialize (System.Web.Routing.RequestContext requestContext) ... Ich habe einige Sicherheitsüberprüfungen dort und müssen Benutzer basierend auf diesen Überprüfungen umleiten –

+0

Warum nicht einige Werte in tempdata oder viewdata setzen und wenn Sie die Controller-Aktion auf der Grundlage des Wertes erreichen, den Sie mit RedirectToAction umleiten können? –

Antwort

19

1) Wenn der Benutzer (Forms abmeldet signout in Aktion) ich auf eine Anmeldeseite umleiten möchten.

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

2) in einem Controller oder Base-Controller Ereignis zB Initialze, möchte ich auf eine andere Seite (AbsoluteRootUrl + Controller + Aktion)

Warum würden Sie von einem Controller init umleiten möchten umleiten?

die Routing-Engine sorgt automatisch für Anfragen, die kommen, wenn Sie meinen, Sie auf einem Controller aus dem Index Aktion umleiten möchten einfach tun:

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

Ich möchte feststellen, dass das erste Element im Account-Controller ist. – GalacticCowboy

+0

Ich denke immer noch, dass mit FormsAuthentication.RedirectToLoginPage() sollte anstelle von return RedirectToAction ("Login") verwendet werden; –

+0

Das Ereignis Controller initialize erkennt Subdomänen für eine Mandantenfähigkeit, erkennt Subdomänenänderungen und überprüft die darauf basierende Benutzerauthentifizierung. –

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

Es hat auch andere Überlastungen, bitte prüfen!

Auch, wenn Sie neu sind und Sie nicht T4MVC verwenden, dann würde ich Ihnen empfehlen, es zu verwenden!

Es gibt Sie Intellisence für Aktionen, Controller, Ansichten etc. (nicht mehr Magie Saiten)

+0

Dies ist gut für die Nummer 1, aber Sie haben nicht verfügbar in Nummer 2. –

+0

In der Tat, in Fall Nummer 2, die RedirectToAction scheint ignoriert zu werden? –

4

1) zur Login-Seite/von der Login-Seite umleiten, nicht die Redirect() Methoden. Verwenden Sie FormsAuthentication.RedirectToLoginPage() und FormsAuthentication.RedirectFromLoginPage()!

2) Sie sollten RedirectToAction ("action", "controller") nur in normalen Szenarien verwenden. Sie möchten die Methode Initialize umleiten? Warum? Ich sehe nicht, warum Sie das jemals tun sollten, und in den meisten Fällen sollten Sie Ihren Ansatz im ..Wenn Sie dies für die Authentifizierung tun wollen ist dies definitiv der falsche Weg (mit sehr wenig Chancen Feind eine Ausnahme) Verwenden Sie das [Authorize] Attribut auf dem Controller oder Methode anstelle :)

UPD: , wenn Sie eine gewisse Sicherheit haben Kontrollen im Initialise Verfahren, und der Benutzer keinen Zugriff auf diese Methode haben, können Sie ein paar Dinge tun: a)

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

Dies wird den Benutzer zurück auf die Login-Seite senden. Wenn Sie ihn an einem benutzerdefinierten Speicherort senden möchten, können Sie etwas tun (cautios: Pseudo-Code)

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

Keine Notwendigkeit, die vollständige URL angeben. Das sollte genug sein. Wenn Sie darauf bestehen, vollständig auf die volle url:

Response.Redirect(new Uri(Request.Url, Url.Action("action", "controller")).ToString()); 
+0

Es gibt eine Authentifizierungsprüfung, aber es hat mehr damit zu tun, einen Benutzer gegen einen Mandanten in einer mandantenfähigen Anwendung zu prüfen, und andere Sicherheitsprüfungen werden durchgeführt. Wenn es einen Verstoß gibt, sollte der Benutzer ausgeloggt und irgendwo umgeleitet werden (dies könnte eine generische Anmeldung, spezifische Anmeldung, Homepage oder andere Seite sein) –

+0

Nun .. Meine Antwort scheint das zu bedecken, nein? Es sei denn, ich habe etwas verpasst, in diesem Fall werde ich glücklich sein zu helfen) –

+0

Die Weiterleitungen scheinen nicht zu funktionieren von überhaupt initialisieren, so dass ein Umdenken ... weitere Informationen zur Frage hinzufügen ... –

Verwandte Themen