我正在尝试在aspnet vNext中创建一个ActionFilter。在这个过滤器中,我想访问TempData和ViewData(在以前版本的Controller中都可用)。我重写该方法
public override void OnActionExecuting(ActionExecutingContext filterContext)
进入filterContext
我有控制器但是object
而不是ControllerBase
。我原以为ControllerBase
,因为在以前版本的MVC中,ControllerContext
(ActionExecutingContext
的基类)是ControllerBase
,here是源代码, CodePlex上。我知道这可能是因为POCO控制器。
所以,问题是,如果控制器是一个对象,如何访问TempData和ViewData。简单地做一个向下转换(类似于(Controller)filterContext.Controller
),或者有一种最好的方法。
更新
如果在this blog post解释它,但使用aspnet 5,我想实现。
答案 0 :(得分:6)
要从动作过滤器中访问 TempData ,您可以从DI获取名为ITempDataDictionary
的服务。
要从DI获得此服务,您可以在actionContext.HttpContext.RequestServices.GetRequiredService<ITempDataDictionary>()
方法中执行OnActionExecuting
之类的操作。如果您愿意,也可以使用 ServiceFilterAttribute 来使用构造注入。
注意:强>
默认情况下,TempData取决于Session
功能(即TempData的数据存储在Session中),因此您需要做很少的事情才能使其正常工作。
参考Microsoft.AspNet.Session
和Microsoft.Framework.Caching.Memory
个包。
在ConfigureServices
方法中,执行以下操作:
services.AddCaching();
services.AddSession();
在您的Configure
方法中,注册Session
中间件(这是为传入请求创建/附加会话的中间件)并在 之前执行注册MVC。
app.UseSession();
app.UseMvc(...)