2012-01-03 16 views
9

Mam następujące wymagania:wykonywanie kodu przed jakimkolwiek działaniem

na każde żądanie na mojej stronie internetowej, niezależnie od tego, jakie działanie użytkownik próbuje wywołać, trzeba zadzwonić jakiś kod, który sprawdza, czy zasób jest w miejsce. Jeśli tak, to wszystko jest w porządku, a metoda działania powinna być wywoływana normalnie.

Jeśli jednak ten zasób nie jest dostępny, chcę, aby wszystkie żądania zwracały oddzielną stronę z prośbą o wybranie innego zasobu z listy dostępnych.

Czy możliwe jest uruchomienie jednej metody przed jakąkolwiek metodą akcji, która ma opcję anulowania wywołania metody działania, a zamiast tego zrobienie czegoś innego?

+0

Można zaimplementować własny moduł HttpModule, lub może umieścić swój check w 'Application_BeginRequest()' wewnątrz global.asax.cs – rejj

Odpowiedz

16

Spójrz na globalnych filtrów działania (dostępny od asp.net mvc 3): http://msdn.microsoft.com/en-us/library/gg416513%28v=vs.98%29.aspx

Zasadniczo w Global.asax można zarejestrować filtr globalnie podczas uruchamiania aplikacji (w Application_Start()) z:

GlobalFilters.Filters.Add(new MyActionFilterAttribute()); 

następnie można zastąpić metodę OnActionExecuting i ustawić właściwość Wynik z RedirectToRouteResult.

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (IsMyResourceAvailable()) 
    { 
     filterContext.Result = new RedirectToRouteResult(
      new RouteValueDictionary { 
       { "Controller", "YourControllerName" }, 
       { "Action", "YourAction" } 
      }); 
    } 

    base.OnActionExecuting(filterContext); 
} 
5

MVC zapewnia kilka haczyków, aby to zrobić.

W kontrolerze podstawowym można zastąpić Controller.OnActionExecuting(context), który uruchamia się tuż przed wykonaniem akcji. Możesz ustawić context.Result na dowolny ActionResult (taki jak RedirectToAction), aby zastąpić akcję.

Alternatywnie można utworzyć ActionFilterAttribute, a dokładnie tak, jak powyżej, zastąpić metodę OnActionExecuting. Następnie wystarczy zastosować atrybut do dowolnego kontrolera, który tego potrzebuje.

Powiązane problemy