如何在我自己的实用程序类中访问TempData?或者TempData在构造函数中为null

时间:2017-09-11 22:01:23

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

我在一些观点/动作中使用TempData,但我想将其提取到某个类中。问题是如果我尝试在Controller的构造函数中创建我的类,那么TempDate就是null。更好的是,我希望让我的课程可以注入Controller。因此,我需要在创建类时访问TempData。

那么如何在一个单独的类中构造这个TempData呢?

这是ASP.NET Core 2.0 Web应用程序。

1 个答案:

答案 0 :(得分:6)

只需在您需要的地方注入ITempDataDictionaryFactory,即可随时随地访问临时数据。然后,您可以调用其GetTempData,它返回ITempDataDictionary,您可以使用它来访问(读取或写入)当前HTTP上下文的临时数据:

public class ExampleService
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private readonly ITempDataDictionaryFactory _tempDataDictionaryFactory;

    public ExampleService(IHttpContextAccessor httpContextAccessor, ITempDataDictionaryFactory tempDataDictionaryFactory)
    {
        _httpContextAccessor = httpContextAccessor;
        _tempDataDictionaryFactory = tempDataDictionaryFactory;
    }

    public void DoSomething()
    {
        var httpContext = _httpContextAccessor.HttpContext;
        var tempData = _tempDataDictionaryFactory.GetTempData(httpContext);

        // use tempData as usual
        tempData["Foo"] = "Bar";
    }
}

顺便说一下。控制器构造函数中TempDatanull的原因是控制器上下文仅在控制器创建后注入(使用属性注入)。因此,当控制器的构造函数运行时,根本没有关于当前请求的任何信息。

如果您确实注入了您的服务,并且该服务的工作方式与上面的ExampleService类似,那么它甚至可以在构造函数中工作,因为它只是从DI容器本身(工厂)请求必要的信息和HTTP上下文)。