自定义操作过滤器应继承过滤器



,据我所知,每个动作过滤器都应继承iActionFilter和filterAttribute。例如:

public class ActionSpeedProfilerAttribute : FilterAttribute, IActionFilter 
{ 
     public void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
         throw new NotImplementedException(); 
     }
    public void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
         throw new NotImplementedException(); 
     } 
}

http://www.dotnetcurry.com/aspnet-mvc/976/aspnet-mvc-custom-action-filter

但是在ASP.NET的Microsoft教程中,我们有没有过滤的示例:

public class SampleActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // do something before the action executes
        }
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // do something after the action executes
        }
    }

https://learn.microsoft.com/pl-pl/aspnet/core/mvc/controllers/filters

所以我们是否应该继承过滤器?

如果您只想在全球添加过滤器(在FilterConfig中(,则不需要使用FilterAttribute,因此:

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

...这将使每个动作执行此过滤器,因为它实现了IActionFilter

现在,如果要创建一个可以用于特定操作的过滤器,那么它将更好地继承FilterAttribute,因为它允许您这样使用:

public class LogActionAttribute : FilterAttribute, IActionFilter 
{ 
    public void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
        // log something about the action...
    }
    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    } 
}
public class HomeController : Controller
{
    [LogAction]
    public ActionResult Index()
    {
        return View();
    }
}

因此,在这种情况下,您可以选择使用属性


作为旁注,还有一个IResultFilter接口,其工作方式与IActionFilter一样,在执行结果并在执行结果后触发它(同样是IActionFilter(

这样做:

public class LogActionAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
    }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
    }
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
    }
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
    }
}

与:

相同
public class LogActionAttribute : FilterAttribute, IActionFilter, IResultFilter
{
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
    }
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
    }
    public void OnResultExecuted(ResultExecutedContext filterContext)
    {
    }
    public void OnResultExecuting(ResultExecutingContext filterContext)
    {
    }
}

...因为ActionFilterAttribute做同样的事情:

public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
{
    ...
}

最新更新