ASP.NET MVC客户端遍历Session中List集合问题求助
解决ASP.NET MVC中在_Layout.cshtml遍历Session中List的问题
问题原因
你在_Layout.cshtml中调用的是ISession原生的Get(string key)方法,这个方法返回的是字节数组(byte[]),而非你序列化的List<UserSiteList>集合。遍历字节数组时,自然会输出每个字节对应的ASCII编码值,而非预期的站点名称。
同时,即使正确获取到集合,直接输出@item会调用UserSiteList的默认ToString()方法,结果是类的完全限定名,也不是你要的站点信息。
修正步骤
1. 确保引用扩展类命名空间
在_Layout.cshtml顶部添加扩展类所在的命名空间,否则无法找到自定义的泛型Get<T>方法:
@using Customer_Application.DataLayer @inject IHttpContextAccessor contxt;
2. 正确获取Session中的集合
使用你自定义的泛型Get<T>方法,指定类型为List<UserSiteList>:
@{ var userSites = contxt.HttpContext.Session.Get<List<UserSiteList>>("userSites") ?? new List<UserSiteList>(); }
添加?? new List<UserSiteList>()是为了避免Session中无数据时出现空引用异常。
3. 正确遍历并展示站点信息
遍历集合时,访问Site属性来显示站点名称:
<ul class="dropdown-menu"> @foreach (var item in userSites) { <li><a class="dropdown-item" href="#">@item.Site</a></li> } </ul>
这里把普通<li>@item</li>改成带链接的下拉项,更符合导航栏的交互逻辑,你可以根据需求调整href的目标地址。
完整修正后的_Layout.cshtml片段
@using Customer_Application.DataLayer @inject IHttpContextAccessor contxt; @{ var userSites = contxt.HttpContext.Session.Get<List<UserSiteList>>("userSites") ?? new List<UserSiteList>(); } <!DOCTYPE html> <html lang="en"> <head> <!-- 头部内容保持不变 --> </head> <body> <ul class="navbar-nav flex-grow-1 pt-1"> <li class="nav_item dropdown"> <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown"> Sites </a> <ul class="dropdown-menu"> @foreach (var item in userSites) { <li><a class="dropdown-item" href="#">@item.Site</a></li> } </ul> </li> </ul> <!-- 其他页面内容 --> </body> </html>
额外注意事项
确保你已经在项目的依赖注入容器中注册了IHttpContextAccessor,在Program.cs(.NET 6+)或Startup.cs(.NET Framework/.NET 5及以下)中添加:
// Program.cs builder.Services.AddHttpContextAccessor(); // 或 Startup.cs 的 ConfigureServices 方法中 services.AddHttpContextAccessor();
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

