,据我所知,每个动作过滤器都应继承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
{
...
}