微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在自定义ActionFilterAttribute

如何解决在自定义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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。