Asp.Net注册全局自定义过滤器没有[ChildAactionOnly]属性

时间:2015-11-05 12:59:19

标签: asp.net asp.net-mvc action-filter

我知道如何注册应用所有操作的全局过滤器:

protected void Application_Start(){
    GlobalFilters.Filters.Add(new MySweetCustomFiAttribute());
}

但相反,我需要将MySweetCustomFilterAttribute注册到没有(或拥有)[ChildActionOnly]属性的操作。

    // Register MySweetCustomFilterAttribute
    public ActionResult Index()
    {
       return View();
    }

   // Do not register MySweetCustomFilterAttribute
   [ChildActionOnly]
   public ActionResult MySweetChildAction()
    {
      ...
    }

2 个答案:

答案 0 :(得分:2)

如果动作是用[ChildActionOnly]修饰的,你应该在[MySweetCustomFiAttribute]中加入一个旁路来返回。像这样:

if(filterContext.ActionDescriptor.IsDefined(typeof(ChildActionOnlyAttribute), false))
    return;

答案 1 :(得分:0)

在@ pedro-benevides的帮助下完成解决方案

namespace tv2web.Filters{
    public class MainModelFixAttribute : ActionFilterAttribute {
        protected bool IsChild(ControllerContext filterContext) {
            return filterContext.IsChildAction;
        }

    public override void OnResultExecuting(ResultExecutingContext filterContext)  {
        if (IsChild(filterContext)) return;

        filterContext.Controller.ViewBag.mainModel = filterContext.Controller.ViewData.Model;
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext) {
        if (IsChild(filterContext)) return;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        if (IsChild(filterContext)) return;
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext) {
        if (IsChild(filterContext)) return;
    }


}

}