You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:00:54