MVC 4在整个网站中保持数据

本文关键字:数据 网站 MVC | 更新日期: 2023-09-27 18:23:44

我正在努力寻找在整个应用程序和会话中持久保存登录用户数据的最佳方法。我是MVC的新手,但对于web表单,它很简单,只需在主页面上声明一个公共属性,并在登录后设置CurrentUser对象。我在MVC应用程序中尝试过,但我一直收到"object reference not set to a instance object"错误。我不应该说我有一个基类和一个CustomController类,我的所有控制器都是从派生的

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

如您所见,我将CurrentUser对象存储在Session对象中,如下所示(这是在登录操作中):

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对象的形式),并从我的任何控制器轻松访问它。这可能吗?还是更适合在每次页面更改时查找这些数据?

MVC 4在整个网站中保持数据

您已经使用块编写了代码:

using (DbContext db = new DbContext())

以及存储在会话中的对象,该会话是数据库的一部分。db.CompanyUsers.Find(userId);不正确。因为CCD_ 4在数据库对象使用后会对其进行处置。这样一来,你的客户对象也会被处理掉。

请删除using块并尝试。至于处置,您可以手动处置对象。