TempData在RedirectToAction期间不会继承

时间:2012-09-04 03:40:11

标签: c# .net asp.net-mvc-3 razor

我有一个有趣的问题,TempData对象没有将值传递给另一个控制器。

我将TempData["Enroll"]的{​​{1}}方法中的Enroll Controller设置为HttpPost模型。然后,我在Enroll的{​​{1}}方法中阅读TempData["Enroll"]对象,但Register Controller / HttpGet

我需要在3个控制器中保留所有这些数据。

有什么想法?

这是一个代码段

empty

4 个答案:

答案 0 :(得分:3)

我在本地计算机上重定向期间遇到TempData丢失的问题。

我已经检查了web.config sessionState设置是InProc,因此没问题。

原来我在web.config中有另一个设置,它是从生产系统中获取的。它看起来像这样:

"foo".##       // 101574
"foo".hashCode // 101574

将requireSSL转为false后,TempData工作正常。

答案 1 :(得分:1)

我之前遇到过TempData的这些限制。我发现这是不可行的,也是零星的。

您需要考虑您要实现的目标。如果你确实需要存储数据,实际上最好的地方是在db(或存储类型)中,它可能似乎有点矫枉过正,但这是他们的目的。

另外两点:

  1. 有人可以点击你的RegisterController索引方法而不会转到另一个方法,在这种情况下你的代码会破坏。

  2. 如果您正在进行多向导样式处理,为什么不将数据以部分状态存储在数据库中,并仅在最后一个屏幕上完成该过程?通过这种方式,无论是停止/启动还是重新拾取,你都会知道他们在这个过程中的位置。

答案 2 :(得分:1)

我今天遇到了同样的问题。

this link中,有些人解释说RedirectAction方法向浏览器返回HTTP 302状态,这会导致浏览器发出新请求并清除临时值,但我尝试返回HTTP方法303(这也是RedirectAction应该返回的东西)和307,它也没有解决任何问题。

在我的案例中修复TempData问题的唯一方法是将web.config的sessionState directive更改为使用StateServer而不是默认InProc。即:

<system.web>
    <sessionState mode="StateServer" cookieless="AutoDetect" timeout="30" stateConnectionString="tcpip=localhost:42424"></sessionState>
    ...
</system.web>

我在阅读this Greg Shackles' article时想到了这一点,在那里他解释了TempData如何工作并构建了一个自定义TempDataProvider,它依赖于MongoDB数据库而不是默认的会话。

希望我4小时的研究能帮助别人不浪费时间。

答案 3 :(得分:0)

将结果保存到缓存或数据库,或者作为控制器之间的帖子/查询字符串传入。 TempData被多种内容清除,包括工作进程重置,这肯定会在步骤之间发生。

此外,您的上述代码可能会获得null ref异常:

EnrollModel enrollModel = TempData["EnrollModel"] as EnrollModel;
if(enrollModel==null)
{
//handle this model being null
}
model.ClientType = enrollModel.ClientType;

如上所述修复您的问题虽然很难看到所有代码,并且知道是否还有其他可能/不可能引用它。