【问题标题】:ActionFilter not firing at Method level in Base Controller...works at Class LevelActionFilter 未在基本控制器的方法级别触发...在类级别工作
【发布时间】:2013-01-11 20:14:20
【问题描述】:

MVC 4 我有一个操作过滤器,我只想将其应用于基本控制器中的 Index 和 Edit 方法,但是当我将其应用于 Index 和 Edit 方法时,操作过滤器不会触发。但是,如果我在班级级别应用过滤器,它确实有效。

基础控制器:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      只需将您的过滤器应用于索引。如果你想要一个全局过滤器,在 FilterConfig 中注册它:

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

      【讨论】:

      • 啊,有道理,但这是否意味着无法在基本控制器级别为特定操作应用过滤器?我试图避免用这个来装饰每个控制器,只在基本控制器中做一次。
      • 是的 - 如果你想要一个全局过滤器,请在 FilterConfig.cs 中注册 - 更新答案
      • 并且一旦注册为全局过滤器,就会在调用IndexBase的时候被调用?
      • 否 - 对操作调用全局过滤器。由于您的过滤器实现了 OnActionExecuting,因此它将在任何操作开始时被调用。 IndexBase 只是一个方法,而不是一个动作。
      猜你喜欢
      • 1970-01-01
      • 2016-02-07
      • 2012-06-29
      • 2021-10-14
      • 2012-07-05
      • 2015-12-27
      • 1970-01-01
      • 2012-05-12
      • 2023-03-30
      相关资源
      最近更新 更多