2011-07-13 6 views
13

Tengo una situación en la que con cada solicitud de página debo verificar la sesión de la presencia de una ID particular. Si se encuentra esto, debo tomar un objeto relacionado de la base de datos y ponerlo a disposición del controlador. Si no se encuentra una ID de sesión, necesito redirigir al usuario (la sesión expiró).ASP.NET MVC: ¿filtro de acción para configurar las variables del controlador?

Por el momento tengo un trozo de código personalizado (par de líneas) que hace esto al comienzo de cada método de acción dentro de mi controlador, lo que parece una repetición innecesaria.

¿Este escenario es digno de un filtro de acción?

Gracias

ACTUALIZACIÓN una gran información aquí chicos. Gracias

Respuesta

8

Sí, esto suena como una buena aplicación de un filtro de acción, ya que puede aplicarlo en el nivel del controlador para operar en todas las acciones. También podría hacerlo parte de una clase base de controlador, si no desea agregarla a todos los controladores manualmente, o escribir su propia fábrica de controladores que aplique automáticamente este filtro de acción a cada controlador.

Consulte ASP.NET MVC Pass object from Custom Action Filter to Action para pasar datos de un filtro de acción a una acción.

+0

1 y gracias por el enlace en su segundo párrafo - tomó me corresponde a lo que necesitaba para un problema similar. – Funka

8

Crear un controlador de base como esta

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 
      }  
     } 
    } 

Ahora Crear ur controladores como esto

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

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

     } 
} 
+1

He estado utilizando MVC durante casi cuatro años y nunca supe sobre el método 'Initialize', ¡así que gracias! Siempre he estado aplicando este tipo de lógica en el método 'OnActionExecuting' de mi controlador base, pero ahora veo que' Initialize' parece más ... ideal. Esto se debe a que, como todos deberíamos saber, el constructor nos falla, ya que no todas las propiedades del controlador están completamente listas para cuando se llama. Para los perezosos, Intellisense en 'Initialize' dice" Inicializa datos que podrían no estar disponibles cuando se llama al constructor ". ¡Una vez más, gracias! – Funka

3

Otra forma es hacer eso con el modelo de aglutinantes. Supongamos que es objeto 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 
    } 
} 

Por otra parte, esto es más unidad de manera comprobable y claro, ya que esta acción forma se basa en los parámetros suministrados desde fuera

Cuestiones relacionadas