MVC 4在整个网站上保留数据

时间:2014-09-21 17:53:28

标签: c# asp.net-mvc-4

我试图找到在整个应用程序和会话中保留登录用户数据的最佳方法。我对MVC相当新,但是对于Web表单,它就像在主页面上声明公共属性并在登录后设置CurrentUser对象一样简单。我已经尝试使用我的MVC应用程序,但我保留了获取"对象引用未设置为实例对象"错误。我不应该有一个Base类和一个CustomController类,我的所有控制器都来自

public abstract class BaseController : Controller
{
    public CompanyUser CurrentUser
    {
        get { return (Session["CurrentCompanyUser"] as CompanyUser); }
        set { Session["CurrentCompanyUser"] = value; }
    }
}

如您所见,我将CurrentUser对象存储在Session对象中,就像这样(这是在Login操作中):

if (ModelState.IsValid)
{
    if (WebSecurity.Login(model.Username, model.Password))
    {
        using (dbContext db = new dbContext())
        {
            int userId = WebSecurity.GetUserId(model.Username);
            User user = db.Users.Find(userId);

            if (user != null)
            {
                CompanyUser companyUser = db.CompanyUsers.Find(userId);

                if (companyUser.IsActive)
                {
                    CurrentUser = companyUser;

                    if (Roles.GetRolesForUser(model.Username).Contains("Administrator"))
                        return RedirectToAction("Index", "Admin");
                    else
                        return RedirectToAction("Index", "Dashboard");
                }
            }
        }
    }
}

这很好但是当我尝试从DashboardController访问它时:

public ActionResult Index()
{

    return View(new ImageModel() { ImageName = CurrentUser.Company.Logo });
}

我收到以下错误: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

我希望能够存储登录的用户数据(以CompanyUser对象的形式),并可以从我的任何控制器轻松访问它。这是可能的还是更适合在每次更改页面时查找这些数据?

1 个答案:

答案 0 :(得分:0)

您已使用块编写代码:

using (DbContext db = new DbContext())

您在会话中存储的对象是db的一部分。db.CompanyUsers.Find(userId);这是不正确的。因为using()在使用后会释放db对象。这样你的客户对象也会被处理掉。

删除使用块并尝试。 至于dispose,您可以手动配置对象。