C#跨页面正确遍历Session存储的Dictionary实现方法
跨页面从Session中取出并遍历存储的Dictionary<string,string>的正确实现方案
问题根因
Session 对所有存储值均以System.Object类型做装箱处理,取值时如果没有执行显式类型转换,拿到的仅为通用object引用,无法被识别为具体的泛型字典类型,也就无法直接执行foreach遍历操作。
正确实现步骤
1. Home.aspx.cs 端字典存储逻辑(基础校验)
确保存入Session的是完整、无空值的*Dictionary<string, string>*实例:
// 初始化泛型字典 Dictionary<string, string> famPlanMembers = new Dictionary<string, string>(); // 按规则添加键值对:用户名作为键、联系手机号作为值 famPlanMembers.Add("第一个成员的用户名", "13800138000"); famPlanMembers.Add("第二个成员的用户名", "13900139000"); // 存入Session指定键下 Session["FamPlanMembersDict"] = famPlanMembers;
2. Home2.aspx.cs 端安全取值与遍历逻辑
取值时必须配合类型判断+显式转换,避免直接硬转换引发的异常,完成转换后即可正常遍历:
// 用模式匹配判断Session值是否为目标字典类型,匹配成功直接生成可用的强类型变量 if (Session["FamPlanMembersDict"] is Dictionary<string, string> membersDictionary) { // 变量已为识别完成的字典类型,可直接执行foreach遍历 foreach (KeyValuePair<string, string> memberInfo in membersDictionary) { string currentUserName = memberInfo.Key; string currentUserPhone = memberInfo.Value; // 在此处编写后续业务处理逻辑 } } else { // 适配Session过期、键值缺失、类型不匹配的异常场景 // 例如:提示Session失效、跳转回首页等 }
常见踩坑提醒
- 禁止直接无转换接收Session值:如
var membersDictionary = Session["FamPlanMembersDict"];,这类写法拿到的变量类型为object,不具备字典的遍历能力,会触发编译错误。 - 不建议直接硬转:如
Dictionary<string, string> membersDictionary = (Dictionary<string, string>)Session["FamPlanMembersDict"];,这类写法如果遇到Session值为null、类型不匹配的场景,会直接抛出无效转换异常,稳定性差。 - 若取值判断始终不通过,可排查Session本身的配置问题:比如会话超时时间过短、跨路径Cookie读取异常、Web应用开启了不兼容Session的无Cookie模式等,这类问题和类型转换逻辑无关。
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

