创建自定义ActionFilterAttribute

时间:2014-07-25 09:31:38

标签: c# asp.net-mvc-4

我创建了一个名为LayoutAttribute的ActionFilterAttribute并将其添加到ActionResult中:

控制器:

    [Layout(PageType.Department,"dnr")]
    public ActionResult Kd(string mainBody, int dnr)
    {

LayoutAttribute:

using System.Web.Mvc;
using Komplett.Infrastructure.NInject;
using Ninject;


namespace Minion.Services.PageState
{
  public class LayoutAttribute : ActionFilterAttribute
  {
    private readonly PageType _pageType;
    private readonly string _pageIdName;

    public LayoutAttribute(PageType PageType,string PageIdName = "")
    {
        _pageType = PageType;
        _pageIdName = PageIdName;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var pageStateModel = KernelContainer.Kernel.Get<PageStateModel>();
        if (filterContext.ActionParameters.ContainsKey(_pageIdName ?? ""))
        {
            pageStateModel.PageId = (string)filterContext.ActionParameters[_pageIdName];
        }
        pageStateModel.PageType = _pageType;
    }
}

}

问题是永远不会调用OnActionExecuting。 我也尝试在global.asax.cs中注册该属性,但后来我需要一个无参数构造函数。我创建了这个并将它添加到global.asax.cs中,如下所示:

GlobalFilters.Filters.Add(new LayoutAttribute());

这没有任何运气。

我做错了什么?如何让MVC调用OnActionExecuting?

1 个答案:

答案 0 :(得分:0)

确保您正在实施

System.Web.Mvc.ActionFilterAttribute

而不是

System.Web.Http.Filters.ActionFilterAttribute

他们都有OnActionExecuting和OnActionExecuted方法,所以它可能有点欺骗