2014-09-21 59 views
0

我試圖找到最好的方式來保持整個應用程序和會話登錄的用戶數據。我對MVC相當陌生,但對於Web表單來說,就像在主頁面上聲明一個公共屬性並在登錄時設置CurrentUser對象一樣簡單。我已經嘗試過使用我的MVC應用程序,但是我一直收到「Object reference未設置爲實例對象「錯誤。我不是說我有一個基類和CustomController類,我的所有控制器從MVC 4堅持在整個網站的數據

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

派生正如你所看到的,我存儲在Session對象的CurrentUser對象,像這樣(這是在登錄操作):

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

這是因爲每次點擊一些控制器動作調用,基本控制器也被實例化並且屬性被重新初始化。 – 2014-09-21 17:55:52

+0

mvc與web不同,你不能這樣做 – 2014-09-21 17:56:12

回答

0

您已經在使用塊寫的代碼:

using (DbContext db = new DbContext()) 

和你是存儲在數據庫是一個部分的會話對象。 db.CompanyUsers.Find(userId);這是不正確的。因爲using()在使用後配置db對象。與此同時你的客戶對象也被處置。

刪除使用塊並嘗試。 至於處置,你可以手動處理對象。

+0

從using語句中刪除它可以使它完美工作。謝謝! – Robert 2014-09-21 18:41:32