【问题标题】:MVC 3 Session.Abandon() called before setting a TempData["myvalue"] = "foo" causes the next controller to have TempData as null在设置 TempData["myvalue"] = "foo" 之前调用 MVC 3 Session.Abandon() 会导致下一个控制器将 TempData 设为 null
【发布时间】:2011-09-23 22:36:02
【问题描述】:

我有一个控制器将逻辑查找:会话值

 //checks value null etc..  for existing record in session memory.
 Session["certnum"]  

然后在控制器中我决定有一个条件:

 //is called to initiate a New Record that will be created.
 Session.Abandon();

然而在程序编码中是 Session.Abandon();在创建 TempData["myobject"] = "foo" 之前出现,并且在单步执行代码时,即时窗口中的 TempData 显示了我的价值,一切看起来都很好。然后重定向到另一个控制器:

return RedirectToAction("ChildInfo", "NewRecord");  

此 ChildInfo 方法不再具有 TempData 值...现在它为空。在设置 TempData 值之前调用了会话放弃方法,不确定这是否是 MVC 会话的错误,但这对我来说是零意义。如果我正在创建一个新的轻量级会话 TempData,那么它应该持续到下一个控制器。如果我删除 Session.Abandon() 方法,那么 TempData 值会像以前一样继续工作。

【问题讨论】:

  • 这里重要的是 TempData 依赖于 session。会话消失了,因此 TempData 消失了。
  • @Adam 是的,我意识到,尽管我在创建 TempData 值之前调用 Session.Abandon() ,但我在控制器的相同 actionresult 方法中,但是,这对我来说似乎很疯狂.
  • 为什么会发疯?您正在重置临时数据所需的对象。这就像说“我删除了表中的所有行,但我不明白为什么在下一个请求中我要请求的行不存在?” :)
  • 如果我认为我正在破坏使用会话的全部功能,那是有道理的。但是,对于您的类比,如果我明确删除了数据表中的所有行,那么显然我无法从数据表中读取这些行,但是如果我认为我实际上是在将一行添加回数据表中(类比)我正在创建一个新的会话对象(Tempdata),它只是简单地封装在方法中,甚至不允许这个新的会话持续存在。嘿,我不同意为什么 .net 这是它的工作方式,这完全是为了选择我的战斗。感谢您的反馈。

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing


【解决方案1】:

Session.Abandon() 方法在请求结束时清除当前会话,这是它的设计目的。

http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.abandon.aspx

如果您想重定向到不同的操作,您确实需要像以前那样调用重定向。如果您使用Abandon(),请求将获得一个新的会话ID。

如果您想从会话中删除某些内容,您需要使用 Session.RemoveSession.RemoveAll 方法(也可以使用 Clear 来执行与 RemoveAll 相同的操作。这将通过以下方式完成:

Session.Remove(itemToRemove);

Session.RemoveAll()

通过使用这两个选项中的任何一个,您可以从会话中删除部分或所有先前存储的数据,而实际上不会导致会话 ID 在下一次请求时重新生成。

【讨论】:

    【解决方案2】:

    Session.Abandon 方法不会清除会话对象,它只会标记不应保留它。在当前请求期间会话对象仍然完好无损。

    当响应完成后,会话对象就被放弃了,这样下次浏览器发出请求时,服务器就得建立一个新的会话对象。当会话对象被放弃时,您在整个请求期间放入会话对象中的任何内容都会消失。

    当您进行重定向时,会向浏览器发送一个重定向页面作为响应,然后浏览器请求新页面。如果将会话对象标记为放弃,然后进行重定向,则新页面将获得新的会话对象。

    【讨论】:

    • 我现在明白了。谢谢古法。
    【解决方案3】:

    这就是它应该的工作方式。

    Session.Abandon 不会立即终止会话。它一直持续到页面的末尾。然后,在下一个页面加载时,会创建一个新会话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-16
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多