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

person Yogurt The Wise    schedule 28.06.2011    source источник


Ответы (1)


Пошли другим путем. Я мог бы просто создать переменную в базовом контроллере и установить для нее значение true в любом действии. Но я хотел использовать атрибут, чтобы было легче понять код. В основном в базовом контроллере у меня был код, который блокировал страницу при определенных условиях, только просмотр. Но, будучи в базовом классе, это повлияет на каждую страницу, было несколько действий, которые мне нужно было всегда устанавливать для редактирования.

Я добавил свойство в 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);
        }

    }
}
person Yogurt The Wise    schedule 29.06.2011