用過ASP.NET Core MVC中IActionFilter攔截器的開發人員,都知道這是一個非常強大的MVC攔截器。最近才發現IActionFilter的OnActionExecuting方法,甚至可以獲取Controller的Action方法參數值。
假如我們在ASP.NET Core MVC項目中有一個HomeController,其中有一個Action方法叫Login,該方法有一個LoginLogoutRequest類型的參數,注意我們在Login上注冊了我們后面會講解的MyActionFilter攔截器:
public class HomeController : Controller { [MyActionFilter] [HttpPost] public IActionResult Login([FromBody]LoginLogoutRequest loginLogoutRequest) { return View(); } }
其參數LoginLogoutRequest類的定義如下:
public class LoginLogoutRequest { public string Username { get; set; } public string Password { get; set; } }
那么我們可以定義一個IActionFilter攔截器叫MyActionFilter,在其OnActionExecuting方法中,來獲取HomeController中Action方法Login的參數LoginLogoutRequest:
public class MyActionFilterAttribute : Attribute, IActionFilter { /// <summary> /// OnActionExecuting方法在Controller的Action執行前執行 /// </summary> public void OnActionExecuting(ActionExecutingContext context) { //循環獲取在Controller的Action方法中定義的參數 foreach (var parameter in context.ActionDescriptor.Parameters) { var parameterName = parameter.Name;//獲取Action方法中參數的名字 var parameterType = parameter.ParameterType;//獲取Action方法中參數的類型 //判斷該Controller的Action方法是否有類型為LoginLogoutRequest的參數 if (parameterType == typeof(LoginLogoutRequest)) { //如果有,那么就獲取LoginLogoutRequest類型參數的值 var loginLogoutRequest = context.ActionArguments[parameterName] as LoginLogoutRequest; var username = loginLogoutRequest.Username; var password = loginLogoutRequest.Password; } } } /// <summary> /// OnActionExecuted方法在Controller的Action執行后執行 /// </summary> public void OnActionExecuted(ActionExecutedContext context) { //TODO } }
可以看到在IActionFilter的OnActionExecuting方法中,通過很簡單的代碼,我們就可以獲取到Login方法參數LoginLogoutRequest的值。