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