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