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

时间:2010-06-02 20:34:38

标签: 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();

这很有效。然后,我可以通过这种方式将Session["loggedIn"]的属性发送到View:

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

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

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

2 个答案:

答案 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"];