2010-07-29 21 views
2

我有一個存儲各種信息(即,FormID,QuestionAnswerList等)的控制器。目前我正在將它們存儲在Controller.Session中,它工作正常。我想把一些邏輯分解成一個單獨的類(即規則控制器),在那裏我可以執行某些檢查等,但是當我嘗試在那裏引用會話時,它是空的。很明顯,會議僅在特定控制者的背景下才有效,但每個人都在做什麼呢?會話狀態如何在MVC 2.0中工作?

我想這很常見,你想在不同的控制器中共享某些「全局」變量,最佳實踐是什麼?

這裏是我的代碼的一部分:

以我BaseController類:

public List<QuestionAnswer> QuestionAnswers 
    { 
     get 
     { 
      if (Session["QuestionAnswers"] == null) 
      { 
       List<QuestionAnswer> qAnswers = qaRepository.GetQuestionAnswers(CurrentSection, UserSmartFormID); 
       Session["QuestionAnswers"] = qAnswers; 
       return qAnswers; 
      } 
      else 
      { 
       return (List<QuestionAnswer>)Session["QuestionAnswers"]; 
      } 
     } 
     set 
     { 
      Session["QuestionAnswers"] = value; 
     } 
    } 

在我的第一控制器(從BaseController派生):

QuestionAnswers = qaRepository.GetQuestionAnswers(CurrentSection, UserSmartFormID); 

我通過代碼臺階並且上述語句執行得很好,設置Session [「QuestionAnswers」],但是當我嘗試從下面的另一個控制器獲取時,Session [「QuestionAnswers」]爲null!

我的第二控制器(也來自BaseController派生):

List<QuestionAnswer> currentList = (List<QuestionAnswer>)QuestionAnswers; 

上面行失敗!它看起來像Session對象本身爲空(不只是會話[「QuestionAnswers」])

+0

你可以給一些代碼。我在我的網站中使用會話狀態沒有問題。實際上,我在會話中存儲自定義類對象,並在會話中傳遞該類中的所有數據。(用戶名,用戶名,用戶區等) – 2010-07-29 00:26:44

+0

這方面沒有真正改變。這裏是一個類似的SO問題:http://stackoverflow.com/questions/915470/asp-net-mvc-session-vs-global-vs-cache 你可以顯示一些設置和檢索的代碼? – spinon 2010-07-29 00:29:04

+0

上面添加了代碼,看起來像Session對象本身爲空並導致失敗。 – 2010-07-29 03:21:38

回答

0

好吧,終於得到它的工作,雖然有點kludgy。我從另一個相關的SO帖子找到了解決方案。

添加以下到我的BaseController:

 public new HttpContextBase HttpContext 
    { 
     get 
     { 
      HttpContextWrapper context = 
       new HttpContextWrapper(System.Web.HttpContext.Current); 
      return (HttpContextBase)context; 
     } 
    } 

然後設置/使用HttpContext.Session取回我的Session變量和工作正常!

1

它有所作爲,如果您檢索使用

HttpContext.Current.Session("mySpecialSession") ''# note this is VB, not C# 
+0

這不存在於MVC控制器中,我看到的最接近的是HttpContext.CurrentHandler,但我相信Controller Session對象是System.Web.HttpSessionBase,它應該可以工作,不是嗎? – 2010-07-29 03:12:14

1

相信TempData的將解決您的問題,您的會話,它在會話中進行操作並保留多個請求,但默認情況下,一旦您再次訪問它,將清除存儲的數據,如果這是一個問題,您可以通過新添加的Keep()函數告訴它保存信息。

所以在你的情況下: ... TempData [「QuestionAnswers」] = qAnswers; ...

那裏的更多信息: http://weblogs.asp.net/jacqueseloff/archive/2009/11/17/tempdata-improvements.aspx

1

你是哪裏在第二控制器訪問會話?會話對象在構造函數中不可用,因爲它稍後會在生命週期中注入。

+0

會話是從BaseController的屬性訪問的(第二個控制器也是從BaseController派生的)。 – 2010-07-30 20:03:10

+0

是的,但是你是否嘗試在第二個控制器的構造函數中使用QuestionAnswers屬性? – DancesWithBamboo 2010-07-31 14:47:33