我们正在关注此官方ASP.NET文档:Managing Application State。在我们的控制器中,我们为HttpContext.Items[...]
设置了一个值,并尝试从相应View中调用的ViewComponent访问该值。但我们在HttpContext.Items[...]
内将ViewComponent
视为空。
控制器:
HttpContext.Items["TestVal"]= "some value";
查看:
@await Component.InvokeAsync("myVC")
ViewComponent :
public class myVCViewComponent : ViewComponent
{
public async Task<IViewComponentResult> InvokeAsync()
{
String myVal= Http.Items["TestVal"].ToString(); //issue: Http.Items["TestVal"] is null at this line
return View(items);
}
}
更新:
在上面的控制器部分中,在Http.Items
HttpContext.Items
更改为HttpContext.Items["TestVal"]= "some value";
答案 0 :(得分:1)
最终更新:
我已经像你的例子那样测试了简单的情况,这很有效(在MVC Core v1.1.0上)。
所以,很难说为什么它不适合你的特定情况。
然而,根据我们在评论中的讨论,您找到了问题的根源:
我意识到这个问题与ViewComponent无关;它与HttpContext的范围相关
原始回答:
在您可以阅读的文档中:
每次请求后都会丢弃其内容。它最好用作在请求期间在不同时间点运行的组件或中间件之间进行通信的方法
以及Working with HttpContext.Items部分:
此集合从HttpRequest开始可用,并在每个请求结束时被丢弃。
并在View Components documentation中:
签名过载而不是当前HTTP请求的任何细节
答案 1 :(得分:1)
在ASP.NET Core中无法获取HttpContext.Current。从单独的类库访问当前的HTTP上下文是ASP.NET Core试图避免的混乱架构类型。
但是可以使用来自ASP.NET Core依赖注入系统的IHttpContextAccessor来获取上下文:
public class SomeClass
{
private readonly IHttpContextAccessor _httpContextAccessor;
public SomeClass(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
}
当注入HttpContextAccessor
时,您可以执行以下操作:var context = _httpContextAccessor.HttpContext;
。