2011-04-15 77 views
1

我有一个ASP.NET MVC项目,它使用TempData将对象从一个控制器动作传递到另一个控制器动作 - 实际上这是一个动作,但接受HTTP帖子的版本。在ASP.NET MVC中,为什么会话时TempData不会持久?

在我的开发机器上,它按预期工作。在测试机器上,第二个控制器操作中的TempData值为空。

我看过的论坛帖子显示检查sessionState正在工作 - 我已经完成了。这两个网站的sessionState设置为InProc - web.config都不包含sessionState条目,但我已检查Session.Mode是InProc。如果我在第一个控制器动作中的Session中放置一个对象,我可以在两台机器上的第二个控制器动作中检索它。

我可以通过在第二个控制器动作中重新执行用于设置TempData的过程来解决此问题,但为什么TempData可能会在测试机器上丢失?

+0

您正在使用的ASP.NET MVC版本非常重要。在ASP.NET MVC 1中,TempData被持久化,直到来自同一浏览器的下一个请求,所以你应该在重定向之前立即使用TempData(在返回RedirectResult之前立即)。由于ASP.NET MVC 2中的值在读取请求后将从TempData中删除(因此它可以存在于多重定向场景中)。因此,对于更具体的答案,我们需要更多关于您正在使用的重定向场景和ASP.NET MVC版本的详细信息。 – tpeczek 2011-04-15 13:33:14

+0

我继承了项目,它使用的是MVC 1.我没有重定向我使用TempData在action/view与提交按钮和接受postback的action/view之间传递数据。这适用于一台机器,但不适用于另一台机器。据我可以告诉web.config的相关位在两台机器上都是一样的。 – 2011-04-18 08:54:17

+0

如果它使用的是ASP.NET MVC 1,那么您必须确定在您描述的GET和POST之间没有其他来自该客户端的请求到您的应用程序。如果有任何其他请求会被识别为同一个客户端,那么TempData将会丢失(如果您的应用程序已经读取了它们,那么这个请求将不会被修复) - 我相信这个链接描述的是非常确切的http://blogs.teamb .com/craigstuntz/2009/01/23/37947/ – tpeczek 2011-04-18 09:02:24

回答

0

请确保您没有阅读说 - 布局(母版页)额外的时间。可以肯定的是,在你设置/获取这个值的地方包装呼叫,并写出跟踪信息,以确保只在你期望的时候调用它。我在应用程序上遇到了类似的问题(mvc2),事实证明,当我看起来不是时,我正在阅读它。

+0

感谢您的建议,但开发网站和测试网站运行相同的代码。在测试网站上,TempData不会进入母版页。 – 2011-04-18 08:45:18