2011-03-06 95 views
1

我想在MVC中使用會話狀態,我一直堅持整個晚上! 我知道會話狀態應該在MVC中謹慎使用 - 但我確定我想用它來做這一頁 - 所以會喜歡解決方案而不是意見。頁面加載之間ASP.NET MVC會話丟失

基本上,我有一個CAPTCHA圖像的聯繫表單。加載頁面時,我想將會話設置爲CAPTCH圖像(動態生成的圖像)​​中使用的字符。 我有一個'新的圖像'鏈接,異步創建一個新的代碼,設置會話和動態加載一個新的圖像到屏幕上。

只要頁面沒有加載或重新加載,會話就會保持設置狀態。我需要能夠根據會話中的代碼驗證用戶輸入(應該反映顯示給用戶的內容),但會話是空的。

如果我對圖像執行AJAX重新加載,即異步設置會話 - 當我執行一個帖子時會話被設置!

發生了什麼事?

我需要能夠堅持會話值 - arrrhhhh!

我有,這是一個基本的控制器:

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

和在控制器我有:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Contact(ContactForm c, string button) 
    { 
    string sessCaptcha = HttpContext.Session["CAPTCHA_Contact"] == null ? "" : HttpContext.Session["CAPTCHA_Contact"].ToString(); 
    } 

任何想法?????漂亮的請用上面的櫻桃:)

謝謝!

回答

4

我這麼讓人看見現在...

永遠不要到Response.End一()(前設置會話值我相信這同樣適用於response.redirect)。

OMG - 這是4小時我永遠不會再回來!

這裏是演示代碼來說明我的無能......

public ActionResult Page1() 
     { 
      Session["test1"] = "hello world"; 

      // This means the session won't be set 
      // It's is used in valid circumstances..e.g. setting session, then dynamically generating an image based on that value. 
      Response.End(); 

      return View(); 
     } 

     public ActionResult Page2() 
     { 
      ViewBag.Test = Session["test1"].ToString(); 

      return View(); 
     } 

     [HttpPost] 
     public ActionResult Page2(FormCollection fc) 
     { 
      ViewBag.Test = "...is still..." + Session["test1"].ToString(); 

      return View(); 
     } 
+0

不要認爲同樣的事情適用於重定向,但你的權利,響應.end將殺死你的會話! – jonezy 2011-03-07 20:55:07

+0

我通過使用不同的結果--FileStreamResult或類似的東西來修復代碼 - 這允許我設置會話並返回通過內存流創建的動態生成的圖像。 – 2011-03-08 13:03:33

+0

我認爲這可能會工作,如果你做了Response.End(true),因爲它允許響應生命週期完成。 – 2011-12-07 10:17:46