2011-06-28 4 views
1

Si je définis un attribut sur une action dans un contrôleur qui hérite de BaseController, est-il possible d'obtenir cette valeur dans une fonction BaseController?MVC Obtenir la valeur ActionFilterAttribute dans le contrôleur de base OnActionExecuting

public class BaseController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { .... want to get the value of DoNotLockPage attribute here? } 



public class CompanyAccountController : BaseController 
{ 
     [DoNotLockPage(true)] 
     public ActionResult ContactList() 
     {... 

Répondre

1

A pris une route différente. J'aurais pu simplement créer une variable dans le basecontroller et la mettre à true dans n'importe quelle action. Mais je voulais utiliser un attribut, juste plus facile à comprendre le code. Fondamentalement dans le basecontroller j'ai eu le code qui verrouillerait la page dans certaines conditions, vue seulement. Mais étant dans la classe de base cela affecterait chaque page, il y avait quelques actions dont j'avais besoin pour être éditées.

J'ai ajouté une propriété au basecontroller. Et dans le OnActionExecuting de l'attribut, je suis en mesure d'obtenir le contrôleur en cours et le définir la propriété à true.

De cette façon, j'ai été en mesure d'obtenir mon paramètre d'attribut dans mon override de ViewResult.

Mon Attribute

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] 
public sealed class DoNotLockPageAttribute : ActionFilterAttribute 
{ 
    private readonly bool _doNotLockPage = true; 

    public DoNotLockPageAttribute(bool doNotLockPage) 
    { 
     _doNotLockPage = doNotLockPage; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var c = ((BaseController)filterContext.Controller).DoNotLockPage = _doNotLockPage; 
    } 
} 

Mon contrôleur de base

public class BaseController : Controller 
{ 
    public bool DoNotLockPage { get; set; } //used in the DoNotLock Attribute 

    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { ...... } 

    protected override ViewResult View(string viewName, string masterName, object model) 
    { 
     var m = model; 

     if (model is BaseViewModel) 
     { 
      if (!this.DoNotLockPage) 
      { 
       m = ((BaseViewModel)model).ViewMode = WebEnums.ViewMode.View; 
      } 
      .... 
      return base.View(viewName, masterName, model); 
     } 

    } 
} 
Questions connexes