我有一个有趣的问题,TempData
对象没有将值传递给另一个控制器。
我将TempData["Enroll"]
的{{1}}方法中的Enroll Controller
设置为HttpPost
模型。然后,我在Enroll
的{{1}}方法中阅读TempData["Enroll"]
对象,但Register Controller
/ HttpGet
。
我需要在3个控制器中保留所有这些数据。
有什么想法?
这是一个代码段
empty
答案 0 :(得分:3)
我在本地计算机上重定向期间遇到TempData丢失的问题。
我已经检查了web.config sessionState设置是InProc,因此没问题。
原来我在web.config中有另一个设置,它是从生产系统中获取的。它看起来像这样:
"foo".## // 101574
"foo".hashCode // 101574
将requireSSL转为false后,TempData工作正常。
答案 1 :(得分:1)
我之前遇到过TempData的这些限制。我发现这是不可行的,也是零星的。
您需要考虑您要实现的目标。如果你确实需要存储数据,实际上最好的地方是在db(或存储类型)中,它可能似乎有点矫枉过正,但这是他们的目的。
另外两点:
有人可以点击你的RegisterController索引方法而不会转到另一个方法,在这种情况下你的代码会破坏。
如果您正在进行多向导样式处理,为什么不将数据以部分状态存储在数据库中,并仅在最后一个屏幕上完成该过程?通过这种方式,无论是停止/启动还是重新拾取,你都会知道他们在这个过程中的位置。
答案 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;
如上所述修复您的问题虽然很难看到所有代码,并且知道是否还有其他可能/不可能引用它。