Asp.net mvc 4 如果在视图中使用,则TempData值不持久

Asp.net mvc 4 如果在视图中使用,则TempData值不持久,asp.net-mvc-4,tempdata,Asp.net Mvc 4,Tempdata,我正在使用 TempData["hdn"] = "1"; 内部控制器 如果我用这个 @{ var hdn = (string)TempData["hdn"]; } 在视图中,TempData[“hdn”]POST中获取null的值。如果我在视图中跳过此代码,它将在POST中持续存在。为什么会发生这种情况?TempData与ViewData类似,但有所不同。它可以包含两个连续请求之间的数据,然后这些请求被销毁 如果要保留TempData值,请使用 TempData.Keep(

我正在使用

TempData["hdn"] = "1";
内部控制器

如果我用这个

 @{
      var hdn = (string)TempData["hdn"];
  }

在视图中,
TempData[“hdn”]
POST中获取null的值。如果我在视图中跳过此代码,它将在POST中持续存在。为什么会发生这种情况?

TempData
与ViewData类似,但有所不同。它可以包含两个连续请求之间的数据,然后这些请求被销毁

如果要保留
TempData
值,请使用

TempData.Keep()
例如:

var hdn= TempData["hdn"]; //it is marked for deletion
TempData.Keep("hdn"); //unmarked it
var hdnNotDeleted = TempData.Peek["hdn"];

读取TempData值后,会将其清除

如果希望在视图中读取值后将其返回控制器,则需要将其包含在隐藏字段中,然后从表单值中读取

比如:

<input type="hidden" name="hdn" value="@hdn" />

HTH

A
TempData
键和值集在调用后将被删除。Satpal谈到了Keep,但如果您希望在每次检索它时都能明确说明而不删除它,那么也可以使用Peek

TempData.Peek(String)
例如:

var hdn= TempData["hdn"]; //it is marked for deletion
TempData.Keep("hdn"); //unmarked it
var hdnNotDeleted = TempData.Peek["hdn"];

如果控制器操作返回一个
ViewResult
,并且您试图将数据放入
TempData
, 不要这样做。在这种情况下,请使用
ViewData/ViewBag
TempData
意味着是一个非常短命的实例,您应该只在当前和后续请求期间使用它。由于
TempData
是这样工作的,因此您需要确定下一个请求将是什么,并且
重定向到另一个
视图
是唯一可以保证这一点的时间。因此,使用
TempData
可靠工作的唯一场景是重定向。所以请记住


有史以来最好的解释:

您多久访问一次
TempData
TempData
用于在调用之间保存内容,但一旦访问就会清除。(您可能希望将该值与查询参数一起传入,也可能希望提交表单)。(请参阅)这里有一个指针,指向有关在MVC中传递数据的更多信息: