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

9
我正在尝试从视图中访问会话数据。
用例:我正在将状态消息存储在会话中,这些消息将显示在页面顶部。目前,我通过使用一个DisplayMessages()函数来实现这一点,该函数设置了一些ViewData[...]属性,并在每个控制器操作的开头调用它。
目标:我希望只需设置一次状态消息,而无需在控制器中添加其他代码即可在下一页加载时显示消息。
因此,我正在尝试直接从视图中访问存储在会话中的消息。
到目前为止,我尝试了以下内容:
  • 一个IHttpContextAccessor的依赖注入(似乎在ASP .NET Core MVC 1.0.0中不再起作用)
  • 创建一个静态类来访问session,包括注释中建议从next()更改为next.invoke()
    • 这没有起作用。我可以访问HttpContextSession.IsAvailable是true,但是session中没有数据。
2个回答

20
以下内容可在视图中使用:Context.Session.TryGetValue 如果您正在使用SessionExtensions,那么Context.Session.GetString将可以使用。

3
通过“Context”而不是“HttpContext”访问它可以正常工作。 - FSMaxB
4
如果在你的视图中添加@using Microsoft.AspNetCore.Http;,你就可以使用Context.Session.GetString("<key>") - adem caglin
@ademcaglin 是的,我已经加载了这些扩展。无论如何还是谢谢你。 - FSMaxB
GetString()方法很好用,但是对我来说...它会在检索到的值周围添加引号。它为什么要这样做呢?这完全没有必要。如果我想要字符串周围有引号,我会自己加的。 - Jay

1

IHttpContextAccessor可以用于访问当前线程的HttpContext。但是,维护此状态具有相当大的性能成本,因此它已从默认服务集中删除。有关更多信息,请参见此GitHub公告

Tratcher发布了以下内容:

可以使用访问当前线程的HttpContext。但是,维护此状态具有相当大的性能成本,因此已将其从默认服务集中删除。

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

但在您的用例中,我建议使用ViewComponent,它是一个可重用的带有逻辑的视图片段,不依赖于控制器。

文档可以在这里找到。

在您的视图中,您只需嵌入它:

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

或者

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

用于同步调用。


感谢您解释为什么依赖注入不再默认工作。 - FSMaxB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接