我正在尝试创建一个存储成员信息的会话,应用程序可以使用该会话信息来显示某些导航并允许访问某些页面和成员角色特定功能。
我已经能够以这种方式将MemberLoggedIn
对象分配给会话:
//code excerpt start...
MemberLoggedIn loggedIn = new MemberLoggedIn();
if (computedHash == member.Hash)
{
loggedIn.ID = member.ID;
loggedIn.Username = member.Username;
loggedIn.Email = member.Email;
loggedIn.Superuser = member.Superuser;
loggedIn.Active = member.Active;
Session["loggedIn"] = loggedIn;
}
else if (ModelState.IsValid) {
ModelState.AddModelError("Password", "Incorrect Username or Password.");
}
return View();
这很有效。然后,我可以通过这种方式将Session["loggedIn"]
的属性发送到View:
[ChildActionOnly]
public ActionResult Login()
{
if (Session["loggedIn"] != null)
ViewData.Model = Session["loggedIn"];
else
ViewData.Model = null;
return PartialView();
}
在部分视图中,我可以使用Model.Username
或Model.Superuser
来引用会话数据。
但是,它似乎在控制器或自定义动作过滤器中不起作用。有没有办法获得相当于Session["loggedIn"].Username
?
答案 0 :(得分:5)
请记住,ASP.Net MVC使用包围应用程序和会话等静态ASP.Net单例的包装器。这是为了允许代码与ASP.Net管道之外的代码分离,并进行单元测试。
从动作过滤器中,使用:
((MembershipUser)filterContext.HttpContext.Session["loggedIn"]).Username
从控制器内部,使用:
((MembershipUser)ControllerContext.HttpContext.Session["loggedIn"]).Username
答案 1 :(得分:2)
像这样:
MemberLoggedIn user = (MemberLoggedIn)HttpContext.Session["loggedIn"];