2011-03-06 58 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