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

如何在视图C#代码块中访问控制器存入Session的复杂数据集?

问题:在视图C#代码块中访问Session存储的复杂类型数据

我已在Session中存储了List<GetProductOutputModel>类型的复杂数据,希望在视图的C#代码块中直接访问它。尝试过HttpContext.Session.GetComplexData<List<GetProductOutputModel>>("productsInCart")和Context.Session.GetString("productsInCart")但未成功,且不想使用ViewBag这类方案——因为设置该数据的控制器方法返回的是JSON结果而非View。

控制器方法代码如下:

public IActionResult GetProductByIdToAddInCart(GetProductInputModel model)
{ 
    var productById = _GetProductAPICall.GetProductsById(model); 
    var products = HttpContext.Session.GetComplexData<List<GetProductOutputModel>>("productsInCart");

    if(products != null && products.Count() != 0)
    {
         products.Add(productById);
        HttpContext.Session.SetComplexData("productsInCart", products.Distinct());
    }
    else
    {
        var firstProductInCart = new List<GetProductOutputModel>();
        firstProductInCart.Add(productById);
        HttpContext.Session.SetComplexData("productsInCart", firstProductInCart);
    }

    var productsInCart = HttpContext.Session.GetComplexData<List<GetProductOutputModel>>("productsInCart");

    return Ok(new { data = productsInCart }); 
} 

解决方案

1. 确认Session扩展方法的正确性

ASP.NET Core原生Session不支持直接存储复杂类型,你的GetComplexData/SetComplexData必须是正确实现的序列化/反序列化扩展方法。如果还没实现或存在问题,用以下代码:

using System.Text.Json;

public static class SessionExtensions
{
    public static void SetComplexData<T>(this ISession session, string key, T value)
    {
        session.SetString(key, JsonSerializer.Serialize(value));
    }

    public static T GetComplexData<T>(this ISession session, string key)
    {
        var data = session.GetString(key);
        return data == null ? default : JsonSerializer.Deserialize<T>(data);
    }
}

2. 在视图中正确调用扩展方法

在视图的C#代码块中,先引入扩展方法所在的命名空间,再通过HttpContext.Session获取数据:

@using YourNamespace.SessionExtensions; // 替换为你的扩展方法所在命名空间

@{
    var productsInCart = HttpContext.Session.GetComplexData<List<GetProductOutputModel>>("productsInCart");
}

<!-- 示例:遍历显示购物车商品 -->
@if (productsInCart != null && productsInCart.Any())
{
    foreach (var product in productsInCart)
    {
        <div>@product.ProductName</div> <!-- 替换为你的Model实际属性 -->
    }
}

3. 关键检查项

  • 确保GetProductOutputModel是可序列化的:有无参构造函数、无循环引用、属性可被JSON序列化。
  • 确认项目已正确配置Session:在Program.cs中需添加Session服务并启用中间件:
    builder.Services.AddSession(options =>
    {
        options.IdleTimeout = TimeSpan.FromMinutes(30);
        options.Cookie.HttpOnly = true;
        options.Cookie.IsEssential = true;
    });
    
    // 中间件顺序:放在UseRouting之后,UseAuthorization之前
    app.UseSession();
    
  • 视图中避免用Context.Session,直接使用HttpContext.Session更明确,避免上下文实例混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:55:38