2011-02-10 25 views
5

Uczę się Asp.net MVC 3. Zastanawiasz się, czy istnieje sposób zdefiniowania metody, która zostanie wykonana przed wykonaniem jakichkolwiek innych metod dowolnych kontrolerów? Oznacza to, że powinien on działać jak konstruktor podstawowej klasy "Controller".Gdzie wprowadzić wspólną funkcjonalność w Asp.net MVC

Obejmuje to niektóre typowe funkcje, takie jak sprawdzanie sesji użytkownika/jeśli nie jest zalogowany przekierowanie do strony logowania, w przeciwnym razie ustaw niektóre wspólne wartości z bazy danych, które będą używane wszędzie w aplikacji. Chcę zapisać je tylko raz, nie chcę wywoływać metody na każdej z metod kontrolera.

Pozdrawiam

Odpowiedz

7

Do tego służą filtry akcji. Istnieją pewne już budować w ramach, jak AuthorizeAttribute:

 [Authorize(Roles = "Admins")] 
     public ActionResult Index() 
     { 
      return View(); 
     } 

Edit:

Filtry można ustawić na działaniach, kontrolerów lub filtrów globalnych.

[Authorize(Roles = "Admins")] 
public class LinkController : Controller 
{ 
    //... 
} 

Wewnątrz Global.asax

protected void Application_Start() 
    { 
     GlobalFilters.Filters.Add(new AuthorizeAttribute { Roles = "Admins" }); 
     //... 
    } 
+0

za pomocą tego, będę musiał użyć tego filer na każdych metod każdych kontrolerów, prawda? Chcę uniknąć tych kroków. Zasadniczo, jeśli rozszerzę klasę "Controller" jako MyController i utworzę wszystkie inne kontrolery, które rozszerzają "MyController", powinien działać. Czy jest to jednak dobre rozwiązanie (sam spróbowałem, szukając porad ekspertów)? – Rana

+3

Możesz używać tych atrybutów na poziomie kontrolera w następujący sposób: [Autoryzuj] public class ReportsController: Controller {} lub zarejestruj się w Global.asax jako globalny dla każdego kontrolera: protected void Application_Start() {GlobalFilters.Filters.Add (new AuthorizeAttribute()); ...} – tpeczek

Powiązane problemy