在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
相关产品推荐
相关产品推荐

