2011-07-13 9 views
13

Mam scenariusz, w którym przy każdym żądaniu strony muszę sprawdzić sesję obecności określonego ID. Jeśli tak się stanie, muszę pobrać powiązany obiekt z bazy danych i udostępnić go kontrolerowi. Jeśli nie znaleziono identyfikatora sesji, muszę przekierować użytkownika (sesja wygasła).ASP.NET MVC: Filtr działania, aby skonfigurować zmienne kontrolera?

W tej chwili mam niestandardowy fragment kodu (kilka linii), który robi to na początku każdej metody działania w moim kontrolerze - co wydaje się niepotrzebnym powtórzeniem.

Czy ten scenariusz zasługuje na filtr działania?

Dzięki

UPDATE Kilka świetnych informacji tutaj faceci. Dziękujemy

Odpowiedz

8

Tak, to brzmi jak dobre zastosowanie filtra akcji, ponieważ można go zastosować na poziomie kontrolera, aby działał na wszystkich akcjach. Możesz także uczynić go częścią klasy bazowej kontrolera, jeśli nie chcesz go dodawać ręcznie do wszystkich kontrolerów lub napisać własną fabrykę kontrolerów, która automatycznie zastosuje ten filtr akcji do każdego kontrolera.

Zobacz ASP.NET MVC Pass object from Custom Action Filter to Action do przekazywania danych z filtra akcji do akcji.

+0

+1 i dziękuję za link w swoim drugim akapicie - wziął mi prawo do tego, czego potrzebowałem do podobnego problemu. – Funka

8

Utwórz podstawowy kontroler jak ten

public class MyContollerController : Controller 
    { 
     public DataEntity userData; 
     protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
     {    
      base.Initialize(requestContext); 
      var customId = requestContext.HttpContext.Session["key"]; 
      if(customId!=null) 
      { 
       userData=getDataGromDataBase(customId); 
      } 
      else 
      { 
       //redirect User 
      }  
     } 
    } 

teraz tworzyć ur kontrolerów jak ten

public class MyDemoController : MyContollerController 
{ 
     public ActionResult Action1() 
     { 
      //access your data 
      this.userData 

     } 
     public ActionResult Action2() 
     { 
      //access your data 
      this.userData 

     } 
} 
+1

Używam MVC od prawie czterech lat i nigdy nie wiedziałem o metodzie "Zainicjuj", więc dziękuję! Zawsze wpychałem tego typu logikę do metody "OnActionExecuting" mojego kontrolera bazowego, ale teraz widzę, że 'Initialize' wydaje się bardziej ... idealne. Dzieje się tak, ponieważ, jak wszyscy powinniśmy wiedzieć, konstruktor zawodzi nas, ponieważ nie wszystkie właściwości kontrolera są w pełni gotowe do czasu jego wywołania. Dla leniwych, Intellisense na 'Initialize' mówi" Inicjalizuje dane, które mogą nie być dostępne, gdy wywoływany jest konstruktor. " Jeszcze raz, dziękuję! – Funka

3

Innym sposobem jest zrobić z modelem wiążących. Załóżmy, że obiekt jest ShoppingCart

//Custom Model Binder 
public class ShoppingCarModelBinder : IModelBinder 
    { 
     public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      //TODO: retrieve model or return null; 
     } 
    } 
//register that binder in global.asax in application start 

ModelBinders.Binders.Add(typeof(ShoppingCart), new ShoppingCartBinder()); 

// controller action 

public ActionResult DoStuff(ShoppingCart cart) 
{ 
    if(cart == null) 
    { 
    //whatever you do when cart is null, redirect. etc 
    } 
    else 
    { 
    // do stuff with cart 
    } 
} 

Ponadto jednostka ta jest bardziej sprawdzalne i jasny sposób, jak w ten sposób działanie opiera się na parametrach dostarczonych z zewnątrz

Powiązane problemy