TempData在RedirectToAction过程中没有被转过来。

问题描述 投票:0回答:1

我有一个有趣的问题 TempData 对象不传值给另一个控制器。

我设置了 TempData["Enroll"]Enroll Controller's HttpPost 方法到一个 Enroll 模型。 然后我读了 TempData["Enroll"] 中的对象 Register Controller's HttpGet 方法,但是是 emptynull.

我需要在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;
    // ...
}
c# asp.net asp.net-mvc-5
1个回答
1
投票

我之前就遇到过TempData的这类限制。我发现它是无法实现的,最好是零星的。

你需要考虑你想实现什么。如果你确实需要存储数据,在实践中,最好的地方是在一个db(或某种存储)中,它可能是 似乎 有点矫枉过正,但这就是他们的目的。

还有两点。

  1. 有人可能会在没有进入另一个方法的情况下 就打到你的RegisterController Index方法,这样的话,你的代码就会崩溃。

  2. 如果你做的是一个多向导式的过程,为什么不把数据以其部分状态存储在db中,只在最后一个屏幕上完成这个过程?这样一来,无论他们在哪里停止启动或再次拾起,你都会知道他们在流程中的位置。


4
投票

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

我已经检查了web.config sessionState Setting,这是InProc,因此没有问题。

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

<httpCookies requireSSL="true" />

把requireSSL设置为false之后 TempData就能正常工作了。


2
投票

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

这个环节 有人解释 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个小时的研究能帮助别人不浪费他们的时间。


0
投票

将你的结果保存到缓存或db中,或者在你的控制器之间以postquerystrings的形式传递。TempData会被几种情况清除,包括worker进程重置,这肯定会发生在步骤之间。

另外你上面的代码可能会得到一个null ref异常。

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

不过要解决你上面的问题是很困难的,因为没有看到所有的代码,也不知道是否有其他的东西可能没有提到它。

© www.soinside.com 2019 - 2024. All rights reserved.