C# MVC4在整个网站中持久化数据

C# MVC4在整个网站中持久化数据,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我正试图找到在整个应用程序和会话中保存登录用户数据的最佳方法。我对MVC还比较陌生,但是对于web表单,只要在母版页上声明一个公共属性并在登录后设置CurrentUser对象就可以了。我已经用我的MVC应用程序尝试过了,但我一直遇到“对象引用未设置为实例对象”错误。我不应该说我有一个基类和一个CustomController类,我的所有控制器都是从这个基类派生的 public abstract class BaseController : Controller { public Comp

我正试图找到在整个应用程序和会话中保存登录用户数据的最佳方法。我对MVC还比较陌生,但是对于web表单,只要在母版页上声明一个公共属性并在登录后设置CurrentUser对象就可以了。我已经用我的MVC应用程序尝试过了,但我一直遇到“对象引用未设置为实例对象”错误。我不应该说我有一个基类和一个CustomController类,我的所有控制器都是从这个基类派生的

public abstract class BaseController : Controller
{
    public CompanyUser CurrentUser
    {
        get { return (Session["CurrentCompanyUser"] as CompanyUser); }
        set { Session["CurrentCompanyUser"] = value; }
    }
}
如您所见,我将CurrentUser对象存储在会话对象中,如下所示(这在登录操作中):

这工作正常,但当我尝试从仪表板控制器访问它时:

public ActionResult Index()
{

    return View(new ImageModel() { ImageName = CurrentUser.Company.Logo });
}
我得到以下错误:
ObjectContext实例已被释放,不能再用于需要连接的操作。


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

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

using (DbContext db = new DbContext())
以及存储在会话中的对象,它是db.CompanyUsers.Find(userId)的一部分这是不正确的。因为
using()
在db对象使用后处理它。这样,您的客户对象也可以得到处置

请删除using块并重试。
至于dispose,您可以手动处理对象。

这是因为每次点击一些控制器操作调用,基本控制器也会实例化,属性也会重新初始化。DMVC与web from非常不同,您不能这样做。将其从using语句中删除可以使其完美工作。谢谢
using (DbContext db = new DbContext())