好问题。据我所知,无法直接从您的过滤器中调用参数——即使您可以通过该方法检索有关它们的元数据。ActionDescriptor.GetParameters()
源值
但是,您可以使用或的属性直接从其源集合中访问这些值,该属性可以从、或其他请求集合中检索数据。所有这些都是.RequestContext.RouteData
RequestContext.HttpContext
Request
Form
QueryString
ActionExecutedContext
例子
因此,例如,如果您的值是从表单集合中检索的(我假设可能是这种情况,因为这是一个[HttpPost]
操作),您的代码可能类似于:
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var request = filterContext.RequestContext.HttpContext.Request;
Int32.TryParse(request.Form.Get("ProductId"), out var productId);
Int32.TryParse(request.Form.Get("Quantity"), out var quantity);
}
验证
请记住,从技术上讲,您ActionFilterAttribute
可以应用于任意数量的操作,因此您应该意识到这一点,而不是假设这些参数将可用。如有必要,您可以使用该ActionDescriptor.ActionName
属性来验证上下文:
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.ActionDescriptor.ActionName.Equals(nameof(MyController.AddToCart))
{
//Retrieve values
}
}
或者,您也可以使用ActionDescriptor.GetParameters()
上面提到的方法来简单地评估参数是否存在,而不管操作的名称是什么。
注意事项
这种方法有一些限制。最为显着地:
- 它将无法检索对操作的内部调用的值,并且
- 它不会执行任何模型绑定,这对于更复杂的对象可能是个问题。
其他框架
您指定 ASP.NET MVC。对于阅读本文的任何使用 ASP.NET Core 的人来说,类库有点不同,并提供了一些额外的功能(例如TryGetValue()
对HttpRequest
方法的调用)。此外,它还提供对BoundProperties
集合的访问,这可能会提供其他选项——尽管我尚未深入研究这些数据以确认。