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

在Core 6中如何通过HttpContext.Session.Set传递List至其他Razor页面?

解决ISession无法直接存储泛型List的问题

错误原因

你遇到的CS0308错误,是因为ISession.Set是非泛型方法,它仅接受string类型的键和byte[]类型的值作为参数,不能直接传入泛型List<reserveInfo>对象。

解决方案

要在Session中存储复杂对象,需要先将对象序列化为可存储的格式(比如JSON字符串),再存入Session;读取时反序列化回原对象。我们可以通过扩展ISession来实现这个功能:

1. 创建Session扩展方法

在项目中添加一个静态类,实现对象的序列化与反序列化:

using Microsoft.AspNetCore.Http;
using System.Text.Json;

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

    // 从Session读取并反序列化为泛型对象
    public static T? Get<T>(this ISession session, string key)
    {
        var jsonString = session.GetString(key);
        return string.IsNullOrEmpty(jsonString) ? default : JsonSerializer.Deserialize<T>(jsonString);
    }
}

2. 存储List到Session

现在可以用这个扩展方法存储你的viewListNextWeek:

// 存储List到Session
HttpContext.Session.Set<List<reserveInfo>>("List", viewListNextWeek);
// 执行跳转
return RedirectToPage("../Food/nextWeekFood");

3. 在目标页面读取Session中的List

在nextWeekFood.cshtml.cs的页面模型类中,读取Session中的数据:

public class NextWeekFoodModel : PageModel
{
    public List<reserveInfo>? ViewListNextWeek { get; set; }

    public void OnGet()
    {
        // 从Session读取List
        ViewListNextWeek = HttpContext.Session.Get<List<reserveInfo>>("List");
    }
}

4. 必要的Session配置

确保你已经在项目中启用了Session中间件:

  • .NET 6+(Program.cs):
var builder = WebApplication.CreateBuilder(args);

// 添加Session服务
builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(30); // 设置Session超时时间
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

builder.Services.AddRazorPages();

var app = builder.Build();

// 启用Session(必须放在UseRouting之后,UseEndpoints之前)
app.UseSession();

app.UseRouting();

app.UseEndpoints(endpoints =>
{
    endpoints.MapRazorPages();
});

app.Run();

额外说明

  • 确保reserveInfo类是可序列化的:类需要有公共无参构造函数,且属性应为可序列化类型(避免循环引用、非公共属性等问题)。
  • 若偏好Newtonsoft.Json(Json.NET),可将扩展方法中的JsonSerializer替换为Newtonsoft.Json.JsonConvert。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:01:00