[英]should custom action filter inherit FilterAttribute?
據我所知,每個動作過濾器都應該繼承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
但是在Microsoft ASP.NET .Core教程中,我們有一些不帶FilterAttribute的示例:
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://docs.microsoft.com/pl-pl/aspnet/core/mvc/controllers/filters
那么我們是否應該繼承FilterAttribute?
如果只想全局添加過濾器(在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();
}
}
因此,在這種情況下,您可以選擇使用Attributes選擇執行哪些操作來執行該過濾器,而不是對每個操作都執行該操作。
附帶說明一下,還有一個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
{
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.