C# 重定向操作期间未结转TempData
我有一个有趣的问题,就是C# 重定向操作期间未结转TempData,c#,.net,asp.net-mvc-3,razor,C#,.net,Asp.net Mvc 3,Razor,我有一个有趣的问题,就是TempData对象没有将值传递给另一个控制器 我将Enroll Controller的HttpPost方法中的TempData[“Enroll”]设置为Enroll模型。然后,我读取寄存器控制器的HttpGet方法中的TempData[“Enroll”]对象,但是为空/为空 我需要在3个控制器上保存所有这些数据 有什么想法吗 下面是一段代码片段 //EnrollController.cs [HttpPost] public ActionResult Index(Enro
TempData
对象没有将值传递给另一个控制器
我将Enroll Controller
的HttpPost
方法中的TempData[“Enroll”]
设置为Enroll
模型。然后,我读取寄存器控制器的HttpGet
方法中的TempData[“Enroll”]
对象,但是为空
/为空
我需要在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;
// ...
}
将结果保存到缓存或db,或作为控制器之间的POST/QUERYSTRING传递。TempData可以通过多种方式清除,包括在步骤之间肯定会发生的工作进程重置
此外,上面的代码可能会出现null ref异常:
EnrollModel enrollModel = TempData["EnrollModel"] as EnrollModel;
if(enrollModel==null)
{
//handle this model being null
}
model.ClientType = enrollModel.ClientType;
但是,如果不查看所有代码,也不知道是否还有其他可能/可能不涉及的内容,就很难解决上述问题。我以前在TempData中遇到过这些限制。我发现它不可靠,充其量只是零星的
你需要考虑你想要达到的目标。如果您确实需要存储数据,实际上最好在db(或类似的存储)中进行存储,这似乎有点过分,但这正是它们的用途
另外两点:
有人可以点击您的RegisterController索引方法,而不必事先点击另一个方法,这样您的代码就会中断
如果您正在执行多向导样式的过程,为什么不将数据以部分状态存储在数据库中,并仅在最后一个屏幕上完成该过程?通过这种方式,无论他们在哪里停止/启动或再次拾取,您都会知道他们在过程中的位置
我今天也有同样的问题
有些人解释说,RedirectAction
方法会向浏览器返回HTTP 302状态,这会导致浏览器发出新请求并清除temp,但我尝试返回HTTP方法303(这是RedirectAction
应该返回的)和307,但它没有解决任何问题
在我的例子中,解决TempData
问题的唯一方法是将web.config的属性更改为使用StateServer
,而不是默认的InProc
。i、 e:
<system.web>
<sessionState mode="StateServer" cookieless="AutoDetect" timeout="30" stateConnectionString="tcpip=localhost:42424"></sessionState>
...
</system.web>
...
我在阅读时发现了这一点,他解释了TempData
的工作原理,并构建了一个自定义TempDataProvider
,它依赖于MongoDB数据库,而不是默认的会话
希望我4个小时的研究能帮助别人不要浪费时间。我遇到了一个问题,在本地机器上重定向时TempData丢失了
我已经检查了web.config sessionState设置,它在proc中,因此没有问题
事实证明,我在web.config中获得了另一个设置,该设置取自生产系统。看起来是这样的:
<httpCookies requireSSL="true" />
将requireSSL改为false后,TempData可以正常工作。您真的不应该使用TempData将模型发送到不同的控制器……它的主要用途是显示一条临时消息。发送模型的最佳方式是什么?当您说“跨越3个控制器”时,是什么意思我只看到两个。如果我可以在两个控制器之间切换,我可以使用相同的策略切换到第三个控制器。因此我尝试使用RouteValueDictionary传递模型,但没有骰子。。。事实上,如果对象没有初始化,它会很好,但只要我在对象中设置了一个属性,HttpGet就会将其接收为null。必须有一种简单的方法将对象从一个控制器传递到另一个控制器。知道我错过了什么吗?