【问题标题】:How Can I Send Data to the Action Filter after Execution of the controller in ASP.NET MVC?如何在 ASP.NET MVC 中执行控制器后将数据发送到操作筛选器?
【发布时间】:2020-06-28 07:04:56
【问题描述】:

以下是我在控制器中的操作。我需要将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
}

【问题讨论】:

    标签: c# asp.net-mvc session tempdata custom-action-filter


    【解决方案1】:

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

    源值

    但是,您可以使用RequestContext.RouteDataRequestContext.HttpContextRequest 属性直接从它们的 集合中访问这些值,该属性可以从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() 方法来简单地评估参数是否存在,而不管操作的名称是什么。

    注意事项

    这种方法有一些限制。最值得注意的是:

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

    其他框架

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

    【讨论】:

    • 谢谢,它成功了我使用了 Int32.TryParse(request.QueryString.Get("ProductId"), out var productId);非常感谢。
    猜你喜欢
    • 2012-02-22
    • 2014-03-07
    • 2018-03-29
    • 2020-10-21
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多