ASP.NET MVC会话在页面加载之间丢失

时间:2011-03-06 21:28:44

标签: asp.net-mvc session state

我正在尝试在MVC中使用会话状态,我整个晚上都被困住了! 我意识到会话状态应该在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();
  }

任何想法?????在上面用樱桃很漂亮:)

谢谢!

2 个答案:

答案 0 :(得分: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();
        }

答案 1 :(得分:0)

您可能希望了解如何使用TempData对象

http://blog.donnfelker.com/2010/02/26/aspnet-mvc2-tempdata-now-persists/