2010-04-16 10 views
35

Chcę sprawdzić pewne rzeczy dotyczące stanu sesji, agenta użytkownika itp., A także ewentualnie podjąć działanie i zwrócić specjalny widok, ZANIM metoda kontrolera ma szansę na wykonanie. Na przykład:Jak uzyskać pewien kod do wykonania przed każdą pojedynczą akcję kontrolera w ASP.NET MVC 2?

najpopularniejsze:
Użytkownik żąda Start/index
kontrole systemowe, aby upewnić x = 0.
x nie jest równa zeru, więc kontroler Home/Index wykonuje jak normalne!.

Ale czasami:
Użytkownik żąda Start/index
kontrole systemowe, aby upewnić x = 0.
x CZY równa zeru!. Użytkownik musi zostać powiadomiony, a żądana akcja kontrolera nie może zostać uruchomiona.

Imyślę, że to wymaga użycia ActionFilters. Ale przeczytałem o nich i nie rozumiem, czy mogę wyprzedzić metodę kontrolera i zwrócić widok, zanim zostanie on wykonany. Jestem pewien, że mógłbym wykonać kod przed uruchomieniem metody kontrolera, ale w jaki sposób mogę go wyłączyć w niektórych instancjach i zwrócić niestandardowy widok lub bezpośrednio do innej metody kontrolera?

Aktualizacja: Zaimplementowałem rozwiązanie RM. To, co zrobiłem:

public class MyAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (myValue == wrongValue) 
     { 
      filterContext.Result = new ViewResult{ViewName = "Notice"}; 
     } 
     base.OnActionExecuting(filterContext); 
    } 
} 

Teraz, kiedy myValue jest źle, te użytkownikom uzyskać pogląd uprzedzenia i wnioskowana kontroler nie jest wykonywany. Aby to zadziałało, zastosowałem go do bazy kontrolerów, z której wszystkie moje kontrolery dziedziczą.

+0

Hej, chris. Daj mi znać, jak sobie z tym poradziłeś? –

Odpowiedz

41

Wszystko zależy od tego, co dokładnie chcesz zrobić i jak. Trzy opcje poniżej:


Możesz użyć do tego ograniczenia trasy. Są one wykonywane podczas oceniania trasy w celu dopasowania.

routes.MapRoute(
    "HomeWithConstraint", 
    "Home/{action}", 
    new {controller="Home", action="index"}, 
    new { x = new MyCustomRouteConstraint() } 
); 

// without constraint, i.e. if above didnt pass 
routes.MapRoute(
    "HomeWithConstraint", 
    "Home/{action}", 
    new {controller="Home", action="index"} 
); 

Powyższy typ MyCustomRouteConstraint sprawdzi w twoim przykładzie x == 0 itd. Nie wiesz dokładnie, co chcesz zrobić, ale pozwoli to sprawdzić warunki przed uruchomieniem i ustawić dodatkowe wartości tras itp.

Zobacz np. Niestandardowe więzy na trasie.


Alternativly, tak można użyć niestandardowego ActionFilter, tylko stosuje się je do klasy kontrolera, a zostanie on wezwany przed wykonywany jest każde działanie.Coś jak:

public class CheckXActionFilterAttribute : ActionFilterAttribute 
{ 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      if(x == 0) 
      { 
       // do something 
       // e.g. Set ActionParameters etc 
      } 
      else 
      { 
       // do something else 
      } 
     } 


} 

Innym rozwiązaniem jest mieć was wszystkich kontrolerów (lub te właściwe) dziedziczą z kontrolera niestandardowego można zrobić, i zastąpić:

OnActionExecuting 

Zobacz here szczegóły.

Aby zrobić to samo, co filtr lub więzy routingu.

Powiązane problemy