我试图找到在整个应用程序和会话中保留登录用户数据的最佳方法。我对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
对象的形式),并可以从我的任何控制器轻松访问它。这是可能的还是更适合在每次更改页面时查找这些数据?
答案 0 :(得分:0)
您已使用块编写代码:
using (DbContext db = new DbContext())
您在会话中存储的对象是db的一部分。db.CompanyUsers.Find(userId);
这是不正确的。因为using()
在使用后会释放db对象。这样你的客户对象也会被处理掉。
删除使用块并尝试。 至于dispose,您可以手动配置对象。