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

alv*_*peo 7 c# asp.net-core asp.net-core-2.0

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

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

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

pok*_*oke 9

只需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";
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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