如何在不同的控制器视图中使用会话数据?
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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
为了在
视图
上显示您的session
,您可以注入ihttpcontextaccessor
对您的视图进行实现,并使用它来获取session < /代码>必需的对象:
您的情况不需要
tempdata
,因为您已经设置了session
。tempdata
要使用一个Controller
操作将变量持续到另一个 contrics 。现在,关于您的问题,
session
在其他控制器
中无法访问,您需要添加services.adddistributedmemorycache()
才能拥有某个位置存储您的会话
数据。您可以在 msdn在您的
startup.cs
中,添加以下内容:In order to show your
Session
on yourView
, you can injectIHttpContextAccessor
implementation to your view and use it to get theSession
object as required:You do not need
TempData
for your case since you are already setting up yourSession
.TempData
is used when you want to persist your variables from oneController
action to another to use them in the action method itself.Now regarding your problem that the
Session
is not accessible in otherController
, you need to addservices.AddDistributedMemoryCache()
in order to have some place to store yourSession
data. You can read more on MSDNIn your
Startup.cs
, add the following: