【问题标题】:How to access Model object in ActionFilterAttribute.OnResultExecuted?如何访问 ActionFilterAttribute.OnResultExecuted 中的模型对象?
【发布时间】:2018-01-25 12:18:20
【问题描述】:

我正在使用 ASP .NET Core 2.0 中的 WEB API 应用程序,其中我有一个继承自 ActionFilterAttribute 的自定义过滤器属性。

如何访问在 POST 调用中传递给控制器​​操作的模型对象,在 ActionFilterAttribute.OnResultExecuted()

上述方法传递了一个ResultExecutedContext 对象,但我找不到一种简单可靠的方法来从中获取模型对象。

我拥有的过滤器如下所示:

public sealed class MyCustomFilter : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        base.OnActionExecuted(context);
    }
    public override void OnResultExecuted(ResultExecutedContext context)
    {
        var model = ????????????? 
    }

    public override void OnResultExecuting(ResultExecutingContext context)
    {
        base.OnResultExecuting(context);
    }
}

控制器如下所示:

[Route("api/[controller]")]
public class MyController : Controller
{
    [ServiceFilter(typeof(MyCustomFilter))]
    [HttpPost]
    public async Task<IActionResult> Post([FromBody] List<MyModel> data)
    {
        // my logic to process model here. In my filter, I want to access data, which is passed into this Post method 

        return Ok();
    }
}

【问题讨论】:

    标签: c# asp.net-web-api asp.net-core-2.0


    【解决方案1】:

    我在控制器中设置了一个私有变量,并在控制器操作中将发布的模型分配给它

     private YourModel _yourModel;
    
     public ActionResult MyAction(YourModel model)
     {
          _yourModel = model;
           return View();
     }
    
     protected override void OnResultExecuted(ResultExecutedContext filterContext)
     {
           //Access _yourModel here     
     }
    

    要从传入的filterContext参数访问模型,可以使用下面的

    var model = ((Controller)filterContext.Controller).ViewData.Model;
    

    尝试使用 TempData。在您的操作中将 tempdata 设置为模型。

     TempData["Model"] = myModel;
    

    然后使用上下文中的 TempData 进行访问。

    var x = ((Controller)filterContext.Controller).TempData["Model"];
    

    希望这就是你的意思。 谢谢

    【讨论】:

    • 过滤器在一个单独的类中实现。
    • 所以你要在你自己的单独类中重写 OnResultExecuted 方法?
    • 好的。我已经更新了我的答案。您应该能够以这种方式访问​​模型。尽管我没有单独的课程,但它适用于我。让我知道它是否可以...不想留下一个没有帮助的答案! :) 谢谢
    • 在我的情况下,以下行给出 null:var model = ((Controller)filterContext.Controller).ViewData.Model;
    • 好的。最后一次尝试。尝试将 Tempdata 设置为您的模型,然后访问上下文的 TempData。我又更新了答案。
    猜你喜欢
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    相关资源
    最近更新 更多