【问题标题】:aspnet vNext ActionFilter and TempDataasp net vNext 操作过滤器和 TempData
【发布时间】:2015-05-25 06:56:07
【问题描述】:

我正在尝试在 aspnet vNext 中创建一个 ActionFilter。在此过滤器中,我想访问 TempData 和 ViewData(在以前版本的 Controller 中都可用)。我覆盖了该方法 public override void OnActionExecuting(ActionExecutingContext filterContext)

进入filterContext 我有控制器,但它是object 而不是ControllerBase。我应该是ControllerBase,因为在先前版本的 MVC 中,ControllerContextActionExecutingContext 的基类)是ControllerBasehere 是 codeplex 中的源代码。我知道这可能是因为 POCO 控制器。

所以,问题是,如果控制器是对象,如何访问 TempData 和 ViewData。简单地做一个向下转换(像这样(Controller)filterContext.Controller)或者有一个最好的方法来做。

更新

如果在this blog post 中解释它,但使用 aspnet 5,我想实现的目标。

【问题讨论】:

  • 您能否提供更多信息,说明您想要实现的场景是什么? TempData 可以通过 DI 的 ITempDataDictionary 服务访问。关于ViewData,它可能取决于场景...如果您正在短路请求,那么您可以自己新建ViewDataDictionary 并在ViewResult 上设置ViewData 属性,例如。或者,如果您只想将数据添加到控制器操作添加更多数据的ViewData,那么我相信向下转换就可以了。
  • 我想将数据设置为稍后在下一个请求获取它。作为一个具体的例子,我想实现与this blog post 中解释的相同。我将在问题中添加此信息。
  • @KiranChalla,我认为您的评论是我问题的答案。我将使用依赖注入。你能发帖回答吗?

标签: c# asp.net-mvc asp.net-core


【解决方案1】:

要从操作过滤器中访问 TempData,您可以从 DI 获取名为 ITempDataDictionary 的服务。

要从 DI 获取此服务,您可以在 OnActionExecuting 方法中执行类似 actionContext.HttpContext.RequestServices.GetRequiredService<ITempDataDictionary>() 的操作。如果您愿意,也可以使用 ServiceFilterAttribute 来使用构造注入。

注意:
TempData 默认依赖于Session 功能(即 TempData 的数据存储在 Session 中),所以你需要做一些事情来让它工作。

  • 参考Microsoft.AspNet.SessionMicrosoft.Framework.Caching.Memory 包。

  • 在您的 ConfigureServices 方法中,执行以下操作:

    services.AddCaching();
    services.AddSession();
    
  • 在您的 Configure 方法中,注册 Session 中间件(这是创建/附加会话到传入请求的中间件)并在注册 MVC 之前完成。

    app.UseSession();
    app.UseMvc(...)
    

【讨论】:

    猜你喜欢
    • 2015-04-03
    • 2015-07-04
    • 2015-05-09
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多