我在一些观点/动作中使用TempData,但我想将其提取到某个类中。问题是如果我尝试在Controller的构造函数中创建我的类,那么TempDate就是null。更好的是,我希望让我的课程可以注入Controller。因此,我需要在创建类时访问TempData。
那么如何在一个单独的类中构造这个TempData呢?
这是ASP.NET Core 2.0 Web应用程序。
答案 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";
}
}
顺便说一下。控制器构造函数中TempData
为null
的原因是控制器上下文仅在控制器创建后注入(使用属性注入)。因此,当控制器的构造函数运行时,根本没有关于当前请求的任何信息。
如果您确实注入了您的服务,并且该服务的工作方式与上面的ExampleService
类似,那么它甚至可以在构造函数中工作,因为它只是从DI容器本身(工厂)请求必要的信息和HTTP上下文)。