ASP.NET vNext的ActionFilter和TempData

5
我正在尝试在aspnet vNext中创建一个ActionFilter。在这个过滤器中,我想要访问TempData和ViewData(在以前的版本中Controller中都可用)。我重写了方法public override void OnActionExecuting(ActionExecutingContext filterContext)filterContext中,我有控制器,但它是一个object而不是ControllerBase。我期望得到一个ControllerBase,因为在MVC的早期版本中,ControllerContextActionExecutingContext的基类)是一个ControllerBase这里是codeplex上的源代码。我理解这可能是由于POCO控制器。
那么问题是,如果控制器是一个对象,如何访问TempData和ViewData?是否只需执行向下转换(例如(Controller)filterContext.Controller)或者有更好的方法?
更新:
我想要实现的内容在这篇博客文章中已经解释了,但是使用的是aspnet 5。

1
你能提供更多关于你想要实现的场景的信息吗?TempData可以通过DI中的ITempDataDictionary服务进行访问。关于ViewData,它可能取决于具体情况...如果你正在短路请求,那么你可以自己创建一个ViewDataDictionary并在ViewResult上设置ViewData属性。或者,如果你只想向ViewData添加数据,以便控制器的操作添加更多数据,那么我认为向下转换就可以了。 - Kiran
我想设置数据,以便在下一个请求中获取它。具体示例可以参考这篇博客文章中所解释的内容。我将在问题中添加此信息。 - vfabre
@KiranChalla,我认为您的评论是我的问题的答案。我将使用依赖注入。您可以将其发布为答案吗? - vfabre
1个回答

6
要访问操作过滤器中的TempData,您可以从DI获取名为ITempDataDictionary的服务。
要从DI获取此服务,您可以在OnActionExecuting方法中执行类似于actionContext.HttpContext.RequestServices.GetRequiredService<ITempDataDictionary>()的操作。您也可以使用ServiceFilterAttribute通过构造注入方式实现。
请注意:
默认情况下,TempData依赖于Session功能(即TempData的数据存储在会话中),因此您需要进行一些设置才能使其正常工作。
  • Reference Microsoft.AspNet.Session and Microsoft.Framework.Caching.Memory packages.

  • In your ConfigureServices method, do the following:

    services.AddCaching();
    services.AddSession();
    
  • In your Configure method, register the Session middleware (this is the one which creates/attaches a session to the incoming requests) and do it before registering MVC.

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接