【问题标题】:ASPNET Core replacement for [Session] =[Session] 的 ASPNET Core 替换 =
【发布时间】:2022-01-22 21:31:13
【问题描述】:

我们正在从 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);

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

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

【问题讨论】:

    标签: c# asp.net-core session serialization asp.net-core-mvc


    【解决方案1】:

    要在您的项目中配置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);               
      });
    }
    

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

    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;
    

    【讨论】:

      【解决方案2】:

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

          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
      
              }
                 
                  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-03
        • 1970-01-01
        相关资源
        最近更新 更多