一、簡介
在.net core 中Filter分為以下六大類:
1、AuthorizeAttribute(權限驗證)
2、IResourceFilter(資源緩存)
3、IActionFilter(執行方法前后的記錄)
4、IResultFilter(結果生成前后擴展)
5、IAlwaysRun(響應結果的補充)
6、IExceptionFilter(異常處理)
二、IResultFilter(同步)
1、定義Filter
public class CustomerResultFilterAttribute : Attribute, IResultFilter { /// <summary> /// 在xx結果之前 /// </summary> /// <param name="context"></param> /// <exception cref="NotImplementedException"></exception> public void OnResultExecuting(ResultExecutingContext context) { Console.WriteLine("CustomerResultFilterAttribute.OnResultExecuting"); if(context.Result is JsonResult) { JsonResult result= (JsonResult)context.Result; context.Result = new JsonResult(new { Data= result.Value, Success=true }); } } /// <summary> /// 在xx結果之后 /// </summary> /// <param name="context"></param> /// <exception cref="NotImplementedException"></exception> public void OnResultExecuted(ResultExecutedContext context) { Console.WriteLine("CustomerResultFilterAttribute.OnResultExecuted"); } }
2、使用Filter
public class Home2Controller : Controller { private readonly ILogger<Home2Controller> _logger; public Home2Controller(ILogger<Home2Controller> logger) { _logger = logger; Console.WriteLine($"執行 {this.GetType().Name} 構造函數"); } [CustomerResultFilter] // 當Filter中有構造函數時,需這樣調用:[TypeFilter(typeof(CustomerResultFilterAttribute))] public IActionResult Index() { Console.WriteLine($"執行 Index 方法"); return Json(new { id="11",name="heheh"}); } }
三、IAsyncResultFilter(異步)
public class CustomerAsyncResultFilterAttribute : Attribute, IAsyncResultFilter { public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) { if (context.Result is JsonResult) { JsonResult result = (JsonResult)context.Result; context.Result = new JsonResult(new { Data = result.Value, Success = true }); } await next.Invoke(); // 這里及時去渲染結果去了 } }
四、總結
作用:適用於統一返回Action的結果格式,JSON格式的統一處理
執行順序 1、先執行Action 方法結束
2、CustomerResultFilterAttribute.OnResultExecuting 3、渲染試圖或返回Action結果 4、CustomerResultFilterAttribute.OnResultExecuted