Asp.net core 如何在asp.net core 3.1中的同一会话中设置不同的通用列表值
我正在运行一个asp.net core 3.1 MVC应用程序,其中我使用了多个报告页。 对于我存储在同一会话中的每个报表数据,该会话包含不同的通用列表 e、 g:报表1在列表模型中有数据,我在Session.set(“AllReportData”,model)中设置了这些数据 对于与上述相同的其他报表,请在同一会话会话中设置另一个通用列表model2(“AllReportData”,model2) 当用户访问第二个报告页面时,我使用了一些ajax调用使该会话为空 但是,当我以前像这样将这个会话设置为null:session.set(“AllReportData”,null)时,它会抛出错误,就像要求使用相同的通用列表类型转换来使会话为null一样 但假设在应用程序中我有100多个报告,在这种情况下,我如何知道这个会话包含什么样的泛型列表类型使其为空Asp.net core 如何在asp.net core 3.1中的同一会话中设置不同的通用列表值,asp.net-core,session,Asp.net Core,Session,我正在运行一个asp.net core 3.1 MVC应用程序,其中我使用了多个报告页。 对于我存储在同一会话中的每个报表数据,该会话包含不同的通用列表 e、 g:报表1在列表模型中有数据,我在Session.set(“AllReportData”,model)中设置了这些数据 对于与上述相同的其他报表,请在同一会话会话中设置另一个通用列表model2(“AllReportData”,model2) 当用户访问第二个报告页面时,我使用了一些ajax调用使该会话为空 但是,当我以前像这样将这个会话
请根据上述场景建议正确的方法。在asp.net core 3.1中配置SessionExtension,如下所示:
using Microsoft.AspNetCore.Http;
using System.Text.Json;
public static class SessionExtensions
{
public static void SetModel(this ISession session, string key, object value)
{
session.SetString(key, JsonSerializer.Serialize(value));
}
public static T GetModel<T>(this ISession session, string key)
{
var value = session.GetString(key);
return value == null ? default : JsonSerializer.Deserialize<T>(value);
}
}
结果:
更新:
如果没有类型转换,则无法调用GetModel方法。因为如果将复杂模型传递给会话,则只能在对其进行反序列化时读取该模型。默认的JsonSerializer需要指定类型来告诉它如何进行反序列化
对于您的场景,如果您只想检查会话是否为null,则可以将对象作为类型传递:
var data = HttpContext.Session.GetModel<object>("AllReportData");
var data=HttpContext.Session.GetModel(“AllReportData”);
正如您所建议的,SetModel方法可以很好地将会话设置为null,但正如我在附加的屏幕截图中看到的,在设置会话null之后,下一行GetModel方法使用类型转换来检查会话值是否为null。但是正如我上面提到的,我做了一个ajax调用,使每个报告请求的会话为空。所以我不知道这节课有什么类型的排版。如果我在没有使用typecast的情况下使用GetModel检查make session null:那么我可以看到here变量仍然包含该值,请检查它并提出建议。Hi@V.Prasad,如果您想在没有typecast的情况下在Seision中获取模型,这是不可能的。您需要知道默认的JsonSerializer必须指定一个类型,然后您可以正确地反序列化。如果您只是想检查会话是否有值,只需传递一个对象,如我的更新答案。我可以在这里获取关于会话的信息,它包含什么类型的信息?e、 g:此会话包含用户类型还是产品类型。在这里,用户或产品与模型相关。请建议。
var data = HttpContext.Session.GetModel<object>("AllReportData");