如果在视图中使用TempData值,则不会持久化

时间:2013-08-28 11:53:43

标签: asp.net-mvc-4 tempdata

我正在使用

TempData["hdn"] = "1";
控制器中的

如果我使用此

  @{
        var hdn = (string)TempData["hdn"];
    }
在POST中获取null的视图TempData["hdn"]中的

。如果我在视图中跳过此代码,它会在POST中持续存在。为什么会这样?

4 个答案:

答案 0 :(得分:9)

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

如果您希望保留TempData

TempData.Keep()

示例:

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

MSDN Docs for Keep

答案 1 :(得分:8)

TempData值在读取后被清除。

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

类似的东西:

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

然后在您的控制器中,您可以执行以下操作:

var hdn = Request.Form["hdn"]

HTH

答案 2 :(得分:3)

TempData密钥&amp;调用后将删除值集。 Satpal谈到了Keep,但是你也可以使用Peek,如果你想在没有删除的情况下每次想要检索它的话都要明确。

TempData.Peek(String)

示例:

var hdnNotDeleted = TempData.Peek["hdn"];

MSDN Documentation for Peek

答案 3 :(得分:0)

如果您的控制器操作返回了ViewResult,并且您很想将数据放入TempData, 请勿这样做。在这种情况下,请使用ViewData/ViewBagTempData是一个非常短暂的实例,您只能在当前请求和后续请求中使用它。由于TempData以这种方式工作,因此您需要确定下一个请求是什么,并且只有Redirecting到另一个View才能保证这一点。因此,唯一有效使用TempData的情况是在重定向时。所以请注意。

有史以来最好的解释:http://sampathloku.blogspot.com/2012/09/how-to-use-aspnet-mvc-tempdata-properly.html