如何读取我在ASP.NET MVC中分配给Session的对象的属性?

qua*_*els 0 c# asp.net-mvc asp.net-mvc-2

我正在尝试创建一个会话,该会话存储成员信息,应用程序可以使用该会话信息来显示某些导航并允许访问某些页面和成员角色特定功能.

我已经能够以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();
Run Code Online (Sandbox Code Playgroud)

这很好用.然后我可以Session["loggedIn"]用这种方式将属性发送到View:

    [ChildActionOnly]
    public ActionResult Login()
    {
        if (Session["loggedIn"] != null)
            ViewData.Model = Session["loggedIn"];
        else
            ViewData.Model = null;
        return PartialView();
    }
Run Code Online (Sandbox Code Playgroud)

在部分视图中,我可以使用Model.Username或引用会话数据Model.Superuser.

但是,它似乎在控制器或自定义动作过滤器中不起作用.有没有办法获得相同的Session["loggedIn"].Username

wom*_*omp 5

请记住,ASP.Net MVC使用包围应用程序和会话等静态ASP.Net单例的包装器.这是为了允许代码与ASP.Net管道之外的代码分离,并进行单元测试.

从动作过滤器中,使用:

((MembershipUser)filterContext.HttpContext.Session["loggedIn"]).Username 
Run Code Online (Sandbox Code Playgroud)

从控制器内部,使用:

((MembershipUser)ControllerContext.HttpContext.Session["loggedIn"]).Username
Run Code Online (Sandbox Code Playgroud)