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 はトリガーされません。

フィルターを Index に適用するだけです。グローバル フィルターが必要な場合は、FilterConfig に登録します。

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new SetAreaControllerFilter());
    }
}
于 2013-01-11T21:37:30.700 に答える