用过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的值。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |