10

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

我将TempData["Enroll"]'Enroll Controller方法HttpPost设置为Enroll模型。然后我在's方法中读取了TempData["Enroll"]对象,但是是/ 。Register ControllerHttpGetemptynull

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

有什么想法吗?

这是一个代码片段

//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;
    // ...
}
4

4 回答 4

4

我遇到了一个问题,即 TempData 在本地机器上的重定向过程中丢失了。

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

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

<httpCookies requireSSL="true" />

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

于 2015-10-01T13:49:55.027 回答
2

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

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

TempData在我的情况下解决问题的唯一方法是将web.config的sessionState指令StateServer更改为 use而不是 default InProc。IE:

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

我在阅读Greg Shackles 的这篇文章时发现了这一点,他在其中解释了如何TempData工作并构建了一个自定义的TempDataProvider,它依赖于 MongoDB 数据库而不是像默认的会话那样。

希望我 4 小时的研究可以帮助人们不要浪费时间。

于 2015-08-27T21:20:52.660 回答
1

我以前遇到过 TempData 的这些限制。我发现它充其量是不现实的和零星的。

你需要考虑你想要达到的目标。如果您确实需要存储数据,实际上最好的地方是在数据库(或各种存储)中,这似乎有点矫枉过正,但这就是他们的目的。

另外两点:

  1. 有人可以在不使用其他方法的情况下点击您的 RegisterController Index 方法,在这种情况下,您的代码会中断。

  2. 如果您正在执行多向导样式的过程,为什么不将部分状态的数据存储在数据库中,并仅在最后一个屏幕上完成该过程?这样,无论他们在哪里停止/开始或再次拿起它,您都将始终知道他们在此过程中的位置。

于 2012-09-04T23:53:35.187 回答
0

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

此外,您上面的代码可能会得到一个空 ref 异常:

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

但是,在没有查看所有代码并且不知道是否还有其他可能/可能不会引用它的情况下,解决您的问题是很困难的。

于 2012-09-04T23:33:25.850 回答