如何从ASP .NET Core MVC 1.0中的视图访问会话

时间:2016-08-31 04:22:52

标签: session asp.net-core asp.net-core-mvc asp.net-core-1.0

我正在尝试从视图中访问会话数据。

使用案例:我将状态消息存储在将显示在页面顶部的会话中。目前,我使用Object.assign()函数实现了这一功能,该函数设置了一些DisplayMessages()属性,并在每个控制器操作的开头调用它。

目标:我想只设置一次状态消息,而不需要控制器中的其他代码来显示下一页加载的消息。

所以我试图直接从视图中访问存储在会话中的消息。

到目前为止,我已尝试过以下内容:

    IHttpContextAccessor的
  • 依赖注入(似乎不再适用于ASP .NET Core MVC 1.0.0
  • Creating a static class to access the session,包括评论中建议的从ViewData[....]next()的更改
    • 这没有用。我可以访问next.invoke()并且HttpContext是真的,但会话中没有数据。

2 个答案:

答案 0 :(得分:20)

以下内容应在视图中有效:Context.Session.TryGetValue

如果您使用SessionExtensions,则Context.Session.GetString将起作用。

答案 1 :(得分:1)

注入IHttpContextAccessor确实有效,但从ASP.NET Core 1.0.0 RC2开始,IHttpContextAcessor默认情况下未注册,因为它对每个请求都有很大的性能开销。有关详细信息,请参阅this GitHub announcement

Tratcher发布:

  

IHttpContextAccessor可用于访问当前线程的HttpContext。但是,维护此状态具有非常重要的性能成本,因此已从默认服务集中删除。

     

依赖它的开发人员可以根据需要添加它:   services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

但是在你的用例中,我建议使用ViewComponent,这是一个可重用的View with logic,不依赖于控制器。

可以找到文档here

在你的视图中,你只需用

嵌入它
@await Component.InvokeAsync("PriorityList", new { maxPriority = 2, isDone = false })

@Component.Invoke("PriorityList", new { maxPriority = 2, isDone = false })

用于同步调用。