[Session] = 的 ASPNET Core 替换

ASPNET Core replacement for [Session] =

我们正在从 ASPNET MVC5 迁移到 ASPNET Core,这意味着我们需要重构一些代码。

我们使用 Session = model 将模型存储在会话中,然后从另一个控制器中检索它。

我们了解到此选项已在 Core 中停用。

我们尝试使用: HttpContext.Session.SetString("Data", JsonConvert.SerializeObject(model));

但是,当反序列化时使用:

var json = HttpContext.Session.GetString("Data");
var model = JsonConvert.DeserializeObject<SearchListViewModel>(json);

生成的模型不会返回相同的结果 - 它是一个长字符串而不是结构化列表(在序列化之前)。

有没有更好的方法来实现将模型从一个控制器传递到另一个控制器?

如果需要,您仍然可以使用会话。你只需要在启动时配置它

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();

            services.AddSession();
             
            ....another your code
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            
            app.UseSession();

            ... another your code

        }
           
            

要在您的项目中配置 Session,您需要执行以下操作:

在您的 Startup.cs 中,在 Configure 方法下添加:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  app.UseSession();
}

然后在ConfigureServices方法下,添加:

public void ConfigureServices(IServiceCollection services)
{
  //Added for session state
  services.AddDistributedMemoryCache();

  services.AddSession(options =>
  {
    options.IdleTimeout = TimeSpan.FromMinutes(10);               
  });
}

创建对象类型的模型 class(无论您要存储什么)。我举个简单的例子:

public class SearchListViewModel
{
    public int SearchID{ get; set; }
    public string SearchName{ get; set; }
    //so on
}

然后创建一个 SessionExtension 助手来设置和检索您的复杂对象 JSON:

public static class SessionExtensions
{
  public static void SetObjectAsJson(this ISession session, string key, object value)
  {
     session.SetString(key, JsonConvert.SerializeObject(value));
  }

  public static T GetObjectFromJson<T>(this ISession session, string key)
  {
     var value = session.GetString(key);
     return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
  }
}

然后最后将您会话中的复杂对象设置为:

var search= new SearchListViewModel();
search.SearchID= 1;
search.SearchName= "Test";   
HttpContext.Session.SetObjectAsJson("SearchListViewModel", search);

要在会话中检索复杂对象:

var searhDetails = HttpContext.Session.GetObjectFromJson<SearchListViewModel>("SearchListViewModel");
int searchID= SearchListViewModel.SearchID;
string searchName= SearchListViewModel.SearchName;