MVC在Base Controller OnActionExecuting中获取ActionFilterAttribute值

时间:2011-06-28 21:41:25

标签: asp.net-mvc actionfilterattribute onactionexecuting

如果我在继承BaseController的控制器中的动作上设置了一个属性,是否可以在某个BaseController函数中获取该值?

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()
        {...

1 个答案:

答案 0 :(得分:1)

采取了不同的路线。 我可以简单地在basecontroller中创建一个变量,并在任何操作中将其设置为true。 但我想使用一个属性,更容易理解代码。 基本上在basecontroller中我有代码可以在某些条件下锁定页面,仅查看。 但是在基类中这将影响每一页,我需要总是设置一些动作进行编辑。

我在basecontroller中添加了一个属性。 在属性的OnActionExecuting中,我能够获取当前控制器并将其属性设置为true。

这样我就可以在我的ViewResult覆盖中获取属性设置。

我的属性

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

我的基本控制器

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

    }
}