ASP.NET Core中从TempData[]检索List<int>时转换后值为null的问题
问题原因
TempData存储复杂类型时会自动执行序列化操作,ASP.NET Core默认的序列化机制(如JSON序列化)会将List<int>转换为JSON格式存储。当你从TempData读取时,反序列化得到的对象类型并非List<int>(通常是JsonElement数组或其他中间类型),因此使用as List<int>进行类型转换会返回null,即便TempData["Products"]本身不为null。
解决方案
方案1:手动序列化/反序列化(推荐)
将List<int>序列化为JSON字符串存入TempData,读取时再反序列化为List<int>:
// 存入TempData的代码 public IActionResult Homepage() { List<int> productIDs = new List<int> { 1, 2}; TempData["Products"] = System.Text.Json.JsonSerializer.Serialize(productIDs); return View(); } // 读取TempData的代码 public IActionResult Category(string categoryName) { List<int> productIDs = null; if (TempData["Products"] is string jsonString) { productIDs = System.Text.Json.JsonSerializer.Deserialize<List<int>>(jsonString); } // 后续处理productIDs return View(); }
方案2:使用强类型包装类(可选)
如果需要频繁传递这类集合,可以定义一个强类型类,让TempData的序列化机制能正确识别类型:
public class ProductIdList { public List<int> Ids { get; set; } } // 存入代码 public IActionResult Homepage() { var productIds = new ProductIdList { Ids = new List<int> {1,2} }; TempData["Products"] = productIds; return View(); } // 读取代码 public IActionResult Category(string categoryName) { var productIdList = TempData["Products"] as ProductIdList; List<int> productIDs = productIdList?.Ids; return View(); }
注:这种方式需要确保你的序列化机制支持复杂类型的正确反序列化,部分默认配置可能仍需调整,因此方案1更稳妥。
额外提示
如果需要在多次请求中保留TempData的值,可以使用TempData.Peek("Products")(读取但不标记为删除)或TempData.Keep("Products")(读取后标记为保留)。
内容的提问来源于stack exchange,提问作者Alice
相关产品推荐
相关产品推荐

