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

ASP.NET Core 6 MVC中如何存储List类型对象到Session并读取

ASP.NET Core 6 MVC 中List类型购物车的Session存储实现

核心差异

ASP.NET Core Session 机制与 .NET Framework MVC 5 不兼容:原生仅支持byte[]、int、string三类基础类型读写,无法直接存储复杂对象/集合,直接传入List类型参数会触发类型转换错误,必须通过序列化、反序列化流程实现复杂类型存取。


第一步:完成Session基础配置

ASP.NET Core 默认未启用Session,需要先在Program.cs中注册服务并配置中间件,注意中间件顺序不能颠倒:

var builder = WebApplication.CreateBuilder(args);

// 注册MVC基础服务
builder.Services.AddControllersWithViews();

// 注册Session服务
builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(30); // 购物车会话超时时间可按需调整
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

var app = builder.Build();

// 其他基础中间件配置
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();

// 必须在控制器路由映射前调用UseSession,否则无法正常读写Session
app.UseSession();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

第二步:封装Session复杂类型读写扩展方法

新建静态扩展类,封装JSON序列化/反序列化逻辑,避免每次存对象重复编写重复代码:

using System.Text.Json;

public static class SessionExtensions
{
    /// <summary>
    /// 将可序列化对象存入Session
    /// </summary>
    public static void SetObject<T>(this ISession session, string key, T value)
    {
        session.SetString(key, JsonSerializer.Serialize(value));
    }

    /// <summary>
    /// 从Session读取指定类型对象
    /// </summary>
    public static T? GetObject<T>(this ISession session, string key)
    {
        var valueStr = session.GetString(key);
        return valueStr == null ? default : JsonSerializer.Deserialize<T>(valueStr);
    }
}

第三步:修正购物车读写逻辑

ASP.NET Core 控制器为请求级生命周期,每次请求都会重新实例化控制器,不要在构造函数中初始化购物车列表,否则会覆盖Session中已存储的购物车数据。
正确的读写代码示例如下:

public class SalesController : Controller
{
    // 定义Session键常量,避免硬编码导致的拼写错误
    private const string CartSessionKey = "cartItems";

    /// <summary>
    /// 购物车列表页
    /// </summary>
    public IActionResult Index()
    {
        // 从Session读取购物车列表,不存在则初始化空列表
        var cartItems = HttpContext.Session.GetObject<List<SalesCartItemsModel>>(CartSessionKey) 
                        ?? new List<SalesCartItemsModel>();
        return View(cartItems);
    }

    /// <summary>
    /// 添加商品到购物车
    /// </summary>
    [HttpPost]
    public IActionResult AddItem(SalesCartItemsModel newItem)
    {
        // 先读取现有购物车数据
        var cartItems = HttpContext.Session.GetObject<List<SalesCartItemsModel>>(CartSessionKey)
                        ?? new List<SalesCartItemsModel>();
        // 追加新商品
        cartItems.Add(newItem);
        // 将更新后的购物车存回Session
        HttpContext.Session.SetObject(CartSessionKey, cartItems);
        
        return RedirectToAction(nameof(Index));
    }

    /// <summary>
    /// 清空购物车
    /// </summary>
    public IActionResult ClearCart()
    {
        HttpContext.Session.Remove(CartSessionKey);
        return RedirectToAction(nameof(Index));
    }
}

注意事项

  • 购物车模型类SalesCartItemsModel需要具备公共无参构造器,属性需要提供公共get/set访问器,确保可以被JSON序列化,不要存在循环引用属性。
  • Session默认存储在服务端内存中,如果是多节点部署场景,需要配置分布式缓存(如Redis、SQL Server)存储Session,否则多节点间会话无法共享。
  • Session适合存储小体量的临时状态数据,如果购物车需要关联用户账号长期存储,建议持久化到数据库。
  • 如果项目使用Newtonsoft.Json作为JSON序列化组件,只需要替换扩展方法中的序列化/反序列化逻辑即可,整体实现逻辑不变。

内容的提问来源于stack exchange,提问作者Omer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:27:17