我有一个有趣的问题 TempData
对象不传值给另一个控制器。
我设置了 TempData["Enroll"]
在 Enroll Controller
's HttpPost
方法到一个 Enroll
模型。 然后我读了 TempData["Enroll"]
中的对象 Register Controller
's HttpGet
方法,但是是 empty
null
.
我需要在3个控制器之间坚持所有这些数据。
任何想法?
这里是一个代码Snippet
//EnrollController.cs
[HttpPost]
public ActionResult Index(EnrollModel model)
{
// ...
TempData["EnrollModel"] = model;
return RedirectToAction("Index", "Register");
}
// RegisterController.cs
public ActionResult Index(string type)
{
RegisterModel model = new RegisterModel();
EnrollModel enrollModel = TempData["EnrollModel"] as EnrollModel;
model.ClientType = enrollModel.ClientType;
// ...
}
我之前就遇到过TempData的这类限制。我发现它是无法实现的,最好是零星的。
你需要考虑你想实现什么。如果你确实需要存储数据,在实践中,最好的地方是在一个db(或某种存储)中,它可能是 似乎 有点矫枉过正,但这就是他们的目的。
还有两点。
有人可能会在没有进入另一个方法的情况下 就打到你的RegisterController Index方法,这样的话,你的代码就会崩溃。
如果你做的是一个多向导式的过程,为什么不把数据以其部分状态存储在db中,只在最后一个屏幕上完成这个过程?这样一来,无论他们在哪里停止启动或再次拾起,你都会知道他们在流程中的位置。
我曾经遇到过一个问题,TempData在我的本地机器上重定向时丢失了。
我已经检查了web.config sessionState Setting,这是InProc,因此没有问题。
结果发现我在web.config中得到了另一个设置,它是从生产系统中获取的。它看起来是这样的。
<httpCookies requireSSL="true" />
把requireSSL设置为false之后 TempData就能正常工作了。
今天我也遇到了同样的问题。
在 这个环节 有人解释 RedirectAction
方法向浏览器返回HTTP 302状态,使浏览器进行新的请求并清除temp,但我试着返回HTTP方法303(这是 RedirectAction
应该是返回)和307也是,也没有解决任何问题。
唯一能解决的办法是 TempData
在我的情况下,是改变了 sessionState
指令 使用web.config的 StateServer
而不是默认的 InProc
即
<system.web>
<sessionState mode="StateServer" cookieless="AutoDetect" timeout="30" stateConnectionString="tcpip=localhost:42424"></sessionState>
...
</system.web>
我是在读到这个的时候发现的 这篇Greg Shackles的文章他解释了如何 TempData
作品,并建立一个定制 TempDataProvider
,它依靠MongoDB数据库而不是像默认的session。
希望我4个小时的研究能帮助别人不浪费他们的时间。
将你的结果保存到缓存或db中,或者在你的控制器之间以postquerystrings的形式传递。TempData会被几种情况清除,包括worker进程重置,这肯定会发生在步骤之间。
另外你上面的代码可能会得到一个null ref异常。
EnrollModel enrollModel = TempData["EnrollModel"] as EnrollModel;
if(enrollModel==null)
{
//handle this model being null
}
model.ClientType = enrollModel.ClientType;
不过要解决你上面的问题是很困难的,因为没有看到所有的代码,也不知道是否有其他的东西可能没有提到它。