1

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
      }
}
4

2 回答 2

1

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

于 2013-01-16T21:51:01.037 回答
0

首先,基本 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());
    }
}
于 2013-01-11T21:37:30.700 回答