如何在ASP.NET Core 2.x中将对象存储和检索到会话状态中?

12

如何将 EmployeeId 和 DesignationId 添加到一个对象中,并在之后从 Session 状态中检索它?

这是我的登录控制器代码:

DataTable dt = sql.GetDataTable("select * from EmpDetails where EmailId = '" + EmailId + "'");
string strempstatus = dt.Rows[0]["Status"].ToString();
string EmpStatus = strempstatus.TrimEnd();

//Models.UserDetails detail = new Models.UserDetails();

if (EmpStatus == "Verified")
{
    //i want to create object which store below two variable value
    string EmployeeId = dt.Rows[0]["Id"].ToString();
    string DesignationId = dt.Rows[0]["D_Id"].ToString();

    //I want to stored object in below session
    HttpContext.Session.SetString("EmployeeData", EmployeeId);

    HttpContext.Session.SetInt32("EmployeeID", Convert.ToInt32(EmployeeId));
    //For Destroy Session
    //HttpContext.Session.Remove("EmployeeID");

    Int32? Saved = HttpContext.Session.GetInt32("EmployeeID");

    if (DesignationId == "1")
    {
        return RedirectToAction("Index", "AdminDashboard");
    }
    else
    {
        return RedirectToAction("Index", "UserDashboard");
    }
}

请在您的问题中发布ConfigureServices()方法的代码。您是否收到任何错误? - Krishnraj Rana
不,我没有收到任何错误信息,但我想知道如何将上述两个变量“EmployeeId和DesignationId”的值存储在对象中,然后如何将该对象存储在会话中,并通过强制转换会话获取值? - Bhautik Kukadiya
1个回答

36
在你的 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);               
  });
}

为了在.NET Core中将复杂对象存储在会话中,请遵循以下步骤:
创建您的对象类型的模型类(例如,EmployeeDetails):
public class EmployeeDetails
{
    public string EmployeeId { get; set; }
    public string DesignationId { get; set; }
}

然后创建一个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 employee = new EmployeeDetails();
employee.EmployeeId = "1";
employee.DesignationId = "2";

HttpContext.Session.SetObjectAsJson("EmployeeDetails", employee);

为了从你的会话中检索复杂对象:
var employeeDetails = HttpContext.Session.GetObjectFromJson<EmployeeDetails>("EmployeeDetails");
int employeeID = Convert.ToInt32(employeeDetails.EmployeeId);
int designationID= Convert.ToInt32(employeeDetails.DesignationId);

编辑:

我看到有很多问题,Session数据在View上无法访问,因此我更新了我的答案,介绍如何实现这一点。为了在View上使用您的Session变量,您需要将IHttpContextAccessor实现注入到View中,并根据需要使用它来获取Session对象

@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor
@{
    //Get object from session
    var mySessionObject = HttpContextAccessor.HttpContext.Session.GetObjectFromJson<EmployeeDetails>("EmployeeDetails");
 }

<h1>@mySessionObject.EmployeeId</h1>
<h1>@mySessionObject.DesignationId</h1>

我已经知道如何创建会话并检索,但问题是如何将“EmployeeId”和“DesignationId”这两个变量的值存储在对象中,然后如何将该对象存储在会话中,并通过转换会话获取值??? - Bhautik Kukadiya
可以像这样使用:https://dev59.com/zUwGtIcB2Jgan1znlHlo#62019854,而不是扩展方法。 - PrashSE
如何在 ASP.NET Core 中使用会话,因为只有 Program.cs 文件而没有 Startup 文件,我需要将 user_name 存储到会话中。在 MVC 中,我之前使用 Session["UserName"] = user.FirstOrDefault().user_name; 从数据库中检索。 - Abdullah
@Abdullah,你的项目是什么类型的?像控制台应用程序这样的某些项目类型不支持Session。如果你正在做基于Web的应用程序,那么使用Session变量就有意义了。 - Rahul Sharma
1
是的,我正在使用Visual Studio 2022。在新项目中没有启动文件,我将创建ASP.NET Core Web应用程序。我尝试了一种解决方案,并将代码放在Program.cs中 builder.Services.AddDistributedMemoryCache(); builder.Services.AddSession(); app.UseSession();还安装了NuGet包Microsoft.AspNetCore.Session,最后为了存储登录时的用户名称值,我使用了这段代码HttpContext.Session.SetString("UserName", userDetails.FirstOrDefault().UserName); 在登录控制器中使用它,谢谢。 - Abdullah
这不会将实际对象存储在会话中,而是存储它的序列化表示。这要求该对象的类实现无参数构造函数,但并非总是如此。例如,我有一个无法以这种方式初始化的类 - 因此看起来无法将其存储在会话中,因为它不再支持存储对象引用了? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接