ActionFilter未在基本控制器中的方法级别触发...在类级别工作

时间:2013-01-11 20:14:21

标签: asp.net-mvc c#-4.0 asp.net-mvc-4 action-filter

MVC 4 我有一个动作过滤器,我想只应用于我的基本控制器中的索引和编辑方法,但当我将它应用于索引和编辑方法时,动作过滤器不会触发。如果我在班级应用过滤器,它可以工作。

基础控制器:

//[SetAreaControllerFilter]  <------ does fire here
    public class BaseControllerSingle<TRepository, TViewModelSingle> : BaseController

    [SetAreaControllerFilter]  <----- doesn't fire here
    public ActionResult IndexBase(TViewModelSingle viewModel, string pageTitle)
    {
        ViewBag.Header = pageTitle;
        return View(viewModel);
    }

对基础的派生类调用:

public ActionResult Index()
        {
            ItemViewModel viewModel = _manageItemsAppServ.CreateNewViewModel(CurrentCompanyId);
            viewModel.DDLOptions = _manageItemsAppServ.CreateFilterOptionsViewModel(CurrentCompanyId);
            return base.IndexBase(viewModel, "Manage Materials");
        }

动作过滤器:

public class SetAreaControllerFilterAttribute : ActionFilterAttribute, IActionFilter 

 {
      public override void OnActionExecuting(ActionExecutingContext filterContext)
      {
          //Set variable to be used by view and partials
           dynamic viewBag = filterContext.Controller.ViewBag;

           viewBag.AreaName = (string)filterContext.RouteData.DataTokens["area"]; //used by OTIS.Core.js to create links
           viewBag.ControllerName = (string)filterContext.RouteData.Values["controller"]; //used by Toolbar adn OTIS.Core.js to create links
      }
}

2 个答案:

答案 0 :(得分:0)

首先,基本ActionFilterAttribute类已经实现了IActionFilter和IResultFilter接口,并继承自Filter类。 IActionFilter我们多余。

现在,要回答您的问题,正在执行的操作以及应用了哪些过滤器是Index。 IndexBase只是ActionResult类型的一种方法,而不是Action。因此,不会触发任何ActionFilter。

只需将过滤器应用于索引即可。如果需要全局过滤器,请在FilterConfig中注册:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new SetAreaControllerFilter());
    }
}

答案 1 :(得分:0)

似乎没有办法将过滤器应用于基本控制器中的操作。您需要在类级别或派生控制器类中的操作中应用它。这似乎不应该是这样,但没有人提供有效的解决方案。