使用TempData在同一控制器Action间传递列表失效问题求助
问题根因
ASP.NET Core 中的 TempData 底层默认基于 Cookie 或 Session 实现,要求存储的所有对象必须支持序列化。基础类型(int、string等)默认自带序列化规则,所以直接传递不会报错;而你自定义的Hesabrsee实体类未配置序列化规则,哪怕是空的列表,也无法被TempData默认的序列化器处理,因此触发报错。
最优解决方案
将列表序列化为JSON字符串后存入TempData,读取时再反序列化为对应类型的列表,无需额外配置中间件,兼容性最好:
- 修改存储逻辑
// 引入System.Text.Json命名空间 TempData["list"] = System.Text.Json.JsonSerializer.Serialize(fraindList.ToList());
- 修改读取逻辑
public IActionResult PrintReport() { if (TempData["list"] is string listJson) { List<Hesabrsee> a = System.Text.Json.JsonSerializer.Deserialize<List<Hesabrsee>>(listJson); // 此处可正常使用拿到的列表数据 } // 如果你读取后还需要在其他请求中使用该TempData,需要调用Keep方法保留 TempData.Keep("list"); return View(); }
额外注意事项
- 如果
Hesabrsee类包含EF Core的导航属性,序列化时可能出现循环引用错误,可配置序列化规则忽略循环引用,或者在序列化前先筛选需要的字段,避免将导航属性加入序列化范围。 - TempData默认基于Cookie存储时最大容量为4096字节,如果你的列表数据量较大,建议改用Session存储,或者传递查询参数到目标Action后再查询数据库获取列表,避免容量超限报错。
内容的提问来源于stack exchange,提问作者sadegh frisat
相关产品推荐
相关产品推荐

