ASP.NET Core MVC通过IActionFilter.OnActionExecuting方法,获取Controller的Action方法参数值

  • ASP.NET Core MVC通过IActionFilter.OnActionExecuting方法,获取Controller的Action方法参数值已关闭评论
  • 90 次浏览
  • A+
所属分类:.NET技术
摘要

用过ASP.NET Core MVC中IActionFilter拦截器的开发人员,都知道这是一个非常强大的MVC拦截器。最近才发现IActionFilter的OnActionExecuting方法,甚至可以获取Controller的Action方法参数值。

用过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的值。