0

以下是我在控制器中的操作。我需要通过ProductIdQuantity过滤器SessionCheck。除了有没有别的办法TempData

[SessionCheck]
[HttpPost]
public ActionResult AddToCart(int ProductId, int Quantity)
{
    try
    {
        //my code here 

        return RedirectToAction("Cart");
    }
    catch (Exception error)
    {
        throw error;
    }
}

以下是我的动作过滤器:

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
  // my code here
}
4

1 回答 1

1

好问题。据我所知,无法直接从您的过滤器中调用参数——即使您可以通过该方法检索有关它们的元数据。ActionDescriptor.GetParameters()

源值

但是,您可以使用或的属性直接从其集合中访问这些值,该属性可以从、或其他请求集合中检索数据。所有这些都是.RequestContext.RouteDataRequestContext.HttpContextRequestFormQueryStringActionExecutedContext

例子

因此,例如,如果您的值是从表单集合中检索的(我假设可能是这种情况,因为这是一个[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()上面提到的方法来简单地评估参数是否存在,而不管操作的名称是什么。

注意事项

这种方法有一些限制。最为显着地:

  1. 它将无法检索对操作的内部调用的值,并且
  2. 它不会执行任何模型绑定,这对于更复杂的对象可能是个问题。

其他框架

您指定 ASP.NET MVC。对于阅读本文的任何使用 ASP.NET Core 的人来说,类库有点不同,并提供了一些额外的功能(例如TryGetValue()HttpRequest方法的调用)。此外,它还提供对BoundProperties集合的访问,这可能会提供其他选项——尽管我尚未深入研究这些数据以确认。

于 2020-03-17T09:25:37.880 回答