Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重定向操作期间未结转TempData_C#_.net_Asp.net Mvc 3_Razor - Fatal编程技术网

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。必须有一种简单的方法将对象从一个控制器传递到另一个控制器。知道我错过了什么吗?