在自定义ActionFilterAttribute

问题描述

我正在尝试为项目创建日志记录处理程序。我正在使用自定义ActionAttribute(LogAction)来读取记录数据的请求。但是,我只能获取Controller和Action值。我一直在寻找大约一个小时,我认为我需要的数据存在于filterContext.HttpContext.Request.QueryString中的某个地方,但是我从中没有任何运气。它始终为空,或者至少看起来是空的。我还遍历了所有RouteData.Values集合,并且其中唯一出现过的就是Controller和Action值。我已经尝试记录整个URL和RawURL,但是没有找到QueryString。我想念什么?

控制器:

 [LogAction]
 public async Task<JsonResult> GetCustomer (int customerId)
 {
     //do stuff
     return Json(json);
 }

属性

public class LogActionAttribute : ActionFilterattribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var controller = filterContext.RequestContext.RouteData.Values["Controller"]
        var action = filterContext.RequestContext.RouteData.Values["Action"];
        var parameters = ??;
        base.OnActionExecuting(filterContext);
    }
}

用于调用控制器动作(AJAX)的JS函数

self.getCustomer = function () {
    var data = { customerId: self.data.viewingCustomerId() };
    $.ajax({
        url: "/Customers/GetCustomer",type: "POST",contentType: "application/json",async: true,data: JSON.stringify(data),success: function (returnedData) {
             //do stuff
        }
    })
}

解决方法

您可以在ActionExecutingContext上使用ActionParameters

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var controller = filterContext.RequestContext.RouteData.Values["Controller"];
    var action = filterContext.RequestContext.RouteData.Values["Action"];
    var parameters = filterContext.ActionParameters["customerId"]; // access action parameters 
    base.OnActionExecuting(filterContext);
}

enter image description here