用過ASP.NET Core MVC中IActionFilter攔截器的開發人員,都知道這是一個非常強大的MVC攔截器。最近才發現IActionFilter的OnActionExecuting方法,甚至可以獲取Controller的Action方法參數值。 假如我們在ASP.NET Core MVC ...
用過ASP.NET Core MVC中IActionFilter攔截器的開發人員,都知道這是一個非常強大的MVC攔截器。最近才發現IActionFilter的OnActionExecuting方法,甚至可以獲取Controller的Action方法參數值。
假如我們在ASP.NET Core MVC項目中有一個HomeController,其中有一個Action方法叫Login,該方法有一個LoginRequest類型的參數,註意我們在Login上註冊了我們後面會講解的MyActionFilter攔截器:
public class HomeController : Controller
{
[MyActionFilter]
[HttpPost]
public IActionResult Login([FromBody]LoginRequestloginLogoutRequest)
{
return View();
}
}
其參數LoginRequest類的定義如下:
public class LoginRequest
{
public string Username { get; set; }
public string Password { get; set; }
}
那麼我們可以定義一個IActionFilter攔截器叫MyActionFilter,在其OnActionExecuting方法中,來獲取HomeController中Action方法Login的參數LoginRequest:
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方法是否有類型為LoginRequest的參數
if (parameterType == typeof(LoginRequest))
{
//如果有,那麼就獲取LoginRequest類型參數的值
var LoginRequest= context.ActionArguments[parameterName] as LoginRequest;
var username = LoginRequest.Username;
var password = LoginRequest.Password;
}
}
}
/// <summary>
/// OnActionExecuted方法在Controller的Action執行後執行
/// </summary>
public void OnActionExecuted(ActionExecutedContext context)
{
//TODO
}
}
可以看到在IActionFilter的OnActionExecuting方法中,通過很簡單的代碼,我們就可以獲取到Login方法參數LoginRequest的值。