2010-04-20 9 views
20

Jestem dość nowy do MVC, ale nie wiesz dokładnie, które Przekierowanie ... zastępuje standardowe przekierowanie stosowane w WebForms czyli średnia Response.Redirect()ASP.NET MVC: Jaki jest prawidłowy sposób przekierowania na strony/akcje w MVC?

Na przykład, muszę przekierować do innych stron w kilka scenariuszy:

1) KIEDY użytkownik się wylogowuje (Formularz wylogowania w działaniu) Chcę przekierować na stronę logowania.

2) w sterowniku lub centralnej sterownika zdarzeń np Initialize chcę przekierować do innej strony (AbsoluteRootUrl + kontroler + Akcja)

Wydaje się, że wiele przekierowań uzyskać nazywane w niektórych przypadkach, co powoduje błędy, coś zrobić z tym, że strona jest już przekierowywana? W jaki sposób można anulować bieżące żądanie i po prostu przekierować?

Aktualizacja:

Odpowiedź na to pytanie (System.Web.Mvc.Controller Initialize) wskazuje, że Initialize nie powinny być wykorzystywane i OnActionExecuting należy stosować?

Wszelkie uwagi na temat, dlaczego nie należy używać Initialize lub dlaczego OnAuthorization nie jest lepszą opcją?

Więcej informacji:

Ten blog post (http://blog.wekeroad.com/blog/aspnet-mvc-securing-your-controller-actions/) wskazuje, że OnActionExecuting jest przydatna do uwierzytelniania (jak wskazano w linku powyżej) Chyba dodając to do tego zdarzenia w klasie bazowej kontroler jest w porządku, jak każdy strona uruchamia akcję w MVC, więc nie powinna wiele zmieniać, a możliwość przekierowania powinna być łatwiejsza. Ma to sens, ale wydaje mi się, że ma to sens dla mnie, że można coś zrobić w przypadku przed tym wydarzeniem i sprawia, że ​​zastanawiamy się, do czego służą te wydarzenia? Będą udzielać OnActionExecuting GO ..

+0

Co to jest kontroler baza zainicjować wydarzenie wspomniałeś? –

+0

@Mahesh Velaga: Posiadam kontroler bazowy, który przesłania inicjalizację zdarzenia, tj. Chronione zastępowanie void Initialize (System.Web.Routing.RequestContext requestContext) ... Mam tam pewne kontrole bezpieczeństwa i muszę przekierować użytkowników na podstawie tych sprawdzeń –

+0

Dlaczego nie ustawić niektórych wartości w tempdata lub viewdata i kiedy osiągniesz działanie kontrolera w oparciu o wartość, którą możesz przekierować za pomocą RedirectToAction? –

Odpowiedz

19

1) Gdy użytkownik loguje się (formy rezygnacja ze subskrypcji w działaniu) Chcę, aby przekierować do strony logowania.

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

2) W przypadku kontrolera lub centralnej sterownika np Initialze chcę przekierować do innej strony (AbsoluteRootUrl + kontroler + Akcja)

dlaczego chcesz przekierować z programu init kontrolera?

silnik routingu automatycznie obsługuje żądania przyjść, jeśli masz na myśli chcesz przekierować z akcji index w kontrolerze po prostu zrobić:

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

Może chcesz zauważyć, że pierwszy element znajduje się w kontrolerze konta. – GalacticCowboy

+0

Nadal uważam, że za pomocą FormsAuthentication.RedirectToLoginPage() powinien być użyty zamiast powrotu RedirectToAction ("Login"); –

+0

Zdarzenie inicjowania kontrolera wykrywa poddomeny w przypadku dzierżawy wielokrotnej, wykrywa zmiany poddomeny i sprawdza również uwierzytelnianie użytkownika na tej podstawie. –

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

Ma inne przeciążenia, jak również, proszę sprawdzić się!

Ponadto, jeśli jesteś nowy i nie używasz T4MVC, to polecam go użyć!

To daje intellisence dla działań, kontrolerów, widoków itp (nie więcej magiczne smyczki)

+0

To jest dobre dla numeru 1, ale nie masz tego dostępnego w numerze 2. –

+0

Rzeczywiście, w numer sprawy 2, RedirectToAction wydaje się być ignorowane? –

4

1), aby przekierować do strony logowania/od strony logowania, nie używać przekierowania() metody. Użyj FormsAuthentication.RedirectToLoginPage() i !

2) Powinieneś po prostu użyć RedirectToAction ("akcja", "kontroler") w standardowych scenariuszach. Chcesz przekierować z boku metodę Initialize? Czemu? Nie widzę powodu, dla którego miałbyś kiedykolwiek chcieć to zrobić, iw większości przypadków powinieneś przejrzeć swoje podejście ...Jeśli chcesz to zrobić dla uwierzytelniania jest to zdecydowanie niewłaściwy sposób (z bardzo małymi szansami wróg wyjątek) użyć atrybutu [Authorize] na kontrolerze lub metody zamiast :)

UPD: jeśli masz jakieś zabezpieczenie kontrole w sposobie inicjalizacji, a użytkownik nie ma dostępu do tej metody, można zrobić kilka rzeczy: )

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

Ten wyśle ​​użytkownikowi powrót na stronę logowania. Jeśli chcesz wysłać go do lokalizacji niestandardowej, można zrobić coś tak (cautios: pseudokod)

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

Nie trzeba podać pełny adres URL. To powinno wystarczyć. Jeśli całkowicie domagać się pełnego adresu URL:

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

Istnieje sprawdzanie autentyczności, ale ma to więcej wspólnego z sprawdzaniem użytkownika przed najemcą w aplikacji dla wielu dzierżawców i wykonywane są inne kontrole bezpieczeństwa. Jeśli jest naruszenie, użytkownik powinien być wylogowany i przekierowany gdzieś (może to być ogólny login, konkretne logowanie, strona główna lub inna strona). –

+0

Cóż .. Moja odpowiedź wydaje się to obejmować, nie? Chyba że coś przeoczyłem, w takim przypadku z chęcią pomogę) –

+0

Przekierowania nie działają w ogóle od inicjowania, więc o konieczności ponownego przemyślenia ... dodaj więcej informacji do pytania ... –

Powiązane problemy