2011-01-25 12 views
18

Chciałbym wiedzieć, w jaki sposób mogę przekierować żądanie wewnątrz konstruktora kontrolera, jeśli muszę to zrobić ?.MVC - Przekierowanie wewnątrz konstruktora

Na przykład: Wewnątrz konstruktora muszę zainicjować obiekt z wartością dynamiczną, w niektórych przypadkach nie chcę tego robić iw tym przypadku chcę przekierować do innego miejsca. W ten sam sposób reszta konstruktora nie zostanie wykonana ani "oryginalna następna akcja".

Jak mogę to zrobić? Dziękuję

EDIT # 1

Początkowo używałem:

public override void OnActionExecuting(ActionExecutingContext filterContext) 

Nie mogę przekierować do innego kontrolera/akcji/URL, ale później w czasie, musiałem zmienić swój kontroler, w którym zainicjowałem zmienną w jego konstruktorze i mam kod, który naprawdę musi przekierować żądanie: P

Potrzebuję tego również dlatego, że OnActionExecuting wykonuje PO e Konstruktor kontrolera. I w mojej logice, przekierowanie musi tam być wykonane.

Odpowiedz

45

Wykonanie przekierowań wewnątrz konstruktora kontrolera nie jest dobrą praktyką, ponieważ kontekst może nie zostać zainicjowany. Standardową praktyką jest napisanie niestandardowego atrybutu akcji i zastąpienie metody OnActionExecuting i wykonanie przekierowania w środku. Przykład:

public class RedirectingActionAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 

     if (someConditionIsMet) 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new 
      { 
       controller = "someOther", 
       action = "someAction" 
      })); 
     } 
    } 
} 

a następnie udekoruj kontroler, który chcesz przekierować za pomocą tego atrybutu. Uważaj, aby nie ozdobić kontrolera, do którego przekierowujesz, za pomocą tego atrybutu lub nie natrafisz na nieskończoną pętlę.

Można więc:

[RedirectingAction] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     // This action is never going to execute if the 
     // redirecting condition is met 
     return View(); 
    } 
} 

public class SomeOtherController : Controller 
{ 
    public ActionResult SomeAction() 
    { 
     return View(); 
    } 
} 
+0

mnie bić do niej :). – bastijn

+0

dziękuję za podpowiedź, ale to właśnie użyłem wcześniej. sprawdź EDIT # 1 – Dryadwoods

+0

@yalyalpsid, następnie pozwól mi to ująć w ten sposób: nie możesz przekierować wewnątrz konstruktora kontrolera, ponieważ kontekst nie został jeszcze zainicjowany. Prawdopodobnie możesz to zrobić w metodzie 'Initialize', ale IMHO robisz coś nie tak, jeśli kiedykolwiek będziesz tego potrzebował. –