如何在不同的控制器视图中使用会话数据?

发布于 2025-01-18 18:04:03 字数 3389 浏览 2 评论 0原文

ApplicationDBContext.cs

public DbSet<Register> RegisterAccount { get; set; }

注册模型

public class Register
{
    [Key]
    public int RegisterId { get; set; }
    [Required]
    [DataType(DataType.EmailAddress, ErrorMessage = "Please enter a valid e-mail address")]
    public string Email { get; set; }
    [Required]
    [Display(Name = "Full Name")]
    public string Name { get; set; }
    [Required]
    [DataType(DataType.Password)]
    [MinLength(5, ErrorMessage = "Password length cannot be less than 5")]
    public string Password { get; set; }

    [NotMapped] // Does not effect the database
    [Compare("Password")]
    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Confirm Password")]
    public string ConfirmPassword { get; set; }

}

我想在各种控制器中使用会话数据,如何管理?

LoginController.cs

public IActionResult Login(Login user)
{
        if (ModelState.IsValid)
        {
            var obj = _db.RegisterAccount.Where(u => u.Email.Equals(user.Email) && u.Password.Equals(user.Password)).FirstOrDefault();

            if (obj != null)
            {
                user.RegisterId = obj.RegisterId;
                _db.LoginAccount.Add(user);
                _db.SaveChanges();
                HttpContext.Session.SetObjectAsJson("Register", obj);
                return RedirectToAction("LoggedIn");
            }
        }

        ModelState.AddModelError("", "Some Error Occured");

        return RedirectToAction("Login");
}

public IActionResult LoggedIn()
{
        var userDetails = HttpContext.Session.GetObjectFromJson<Register>("Register");
        int? thisUserID = Convert.ToInt32(userDetails.RegisterId);

        if (thisUserID != null)
        {
            TempData["Users"] = userDetails;
            return View(); 
        }
        else
        {
            return RedirectToAction("Login");
        }
}

SessionExtension.cs

public static class SessionExtension
{
    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);
    }
}

LoggedIn.cshtml View

@using Microsoft.AspNetCore.Http

@inject IHttpContextAccessor HttpContextAccessor


@{
    var userdetails = HttpContextAccessor.HttpContext.Session.GetObjectFromJson<Register>("Register"); // userdetails is available
}

<h1>Hi @userdetails.Name</h1>

此处显示用户名。

假设我有另一个控制器主页,在索引视图中我想访问登录用户的详细信息,我该怎么做?我尝试过

HomeController/Index.cshtml view

@using Microsoft.AspNetCore.Http

@inject IHttpContextAccessor HttpContextAccessor


@{
    var userdetails = HttpContextAccessor.HttpContext.Session.GetObjectFromJson<Register>("Register"); // userdetails remains null
}

<h1>Hi @userdetails.Name</h1>

Home Controller Index

 public IActionResult Index()
        {
           
            return View();
        }

我想要做的是在用户登录时在我的家庭控制器索引视图以及我的登录控制器索引视图中显示用户名。

ApplicationDBContext.cs

public DbSet<Register> RegisterAccount { get; set; }

Register Model

public class Register
{
    [Key]
    public int RegisterId { get; set; }
    [Required]
    [DataType(DataType.EmailAddress, ErrorMessage = "Please enter a valid e-mail address")]
    public string Email { get; set; }
    [Required]
    [Display(Name = "Full Name")]
    public string Name { get; set; }
    [Required]
    [DataType(DataType.Password)]
    [MinLength(5, ErrorMessage = "Password length cannot be less than 5")]
    public string Password { get; set; }

    [NotMapped] // Does not effect the database
    [Compare("Password")]
    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Confirm Password")]
    public string ConfirmPassword { get; set; }

}

I want to use session data in various controllers, how do I manage that?

LoginController.cs

public IActionResult Login(Login user)
{
        if (ModelState.IsValid)
        {
            var obj = _db.RegisterAccount.Where(u => u.Email.Equals(user.Email) && u.Password.Equals(user.Password)).FirstOrDefault();

            if (obj != null)
            {
                user.RegisterId = obj.RegisterId;
                _db.LoginAccount.Add(user);
                _db.SaveChanges();
                HttpContext.Session.SetObjectAsJson("Register", obj);
                return RedirectToAction("LoggedIn");
            }
        }

        ModelState.AddModelError("", "Some Error Occured");

        return RedirectToAction("Login");
}

public IActionResult LoggedIn()
{
        var userDetails = HttpContext.Session.GetObjectFromJson<Register>("Register");
        int? thisUserID = Convert.ToInt32(userDetails.RegisterId);

        if (thisUserID != null)
        {
            TempData["Users"] = userDetails;
            return View(); 
        }
        else
        {
            return RedirectToAction("Login");
        }
}

SessionExtension.cs

public static class SessionExtension
{
    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);
    }
}

LoggedIn.cshtml View

@using Microsoft.AspNetCore.Http

@inject IHttpContextAccessor HttpContextAccessor


@{
    var userdetails = HttpContextAccessor.HttpContext.Session.GetObjectFromJson<Register>("Register"); // userdetails is available
}

<h1>Hi @userdetails.Name</h1>

Here, the username is displayed.

Say I have another controller Home and in the Index View I want to access the details of logged in user, how do I do it? I have tried

HomeController/Index.cshtml view

@using Microsoft.AspNetCore.Http

@inject IHttpContextAccessor HttpContextAccessor


@{
    var userdetails = HttpContextAccessor.HttpContext.Session.GetObjectFromJson<Register>("Register"); // userdetails remains null
}

<h1>Hi @userdetails.Name</h1>

Home Controller Index

 public IActionResult Index()
        {
           
            return View();
        }

What I want to do is to display the user name in my home controller index view as well as my login controller index view whenever the user has logged in.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无法言说的痛 2025-01-25 18:04:03

为了在视图上显示您的session,您可以注入ihttpcontextaccessor对您的视图进行实现,并使用它来获取session < /代码>必需的对象:

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

<h1>@mySessionObject.Name</h1>
//So on

您的情况不需要tempdata,因为您已经设置了sessiontempdata要使用一个Controller操作将变量持续到另一个 contrics 。

现在,关于您的问题,session在其他控制器中无法访问,您需要添加services.adddistributedmemorycache()才能拥有某个位置存储您的会话数据。您可以在 msdn

在您的startup.cs中,添加以下内容:

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

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

In order to show your Session on your View, you can inject IHttpContextAccessor implementation to your view and use it to get the Session object as required:

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

<h1>@mySessionObject.Name</h1>
//So on

You do not need TempData for your case since you are already setting up your Session. TempData is used when you want to persist your variables from one Controller action to another to use them in the action method itself.

Now regarding your problem that the Session is not accessible in other Controller, you need to add services.AddDistributedMemoryCache() in order to have some place to store your Session data. You can read more on MSDN

In your Startup.cs, add the following:

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

  services.AddSession(options =>
  {
     options.IdleTimeout = TimeSpan.FromMinutes(10);               
  });
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文