asp.net-mvc-2 - TempData 未按预期清除

标签 asp.net-mvc-2

我正在开发一个使用 ASP.NET 4.0 和 MVC 2.0 的应用程序。如果它有任何相关性,我正在使用 VS2010。

我遇到了 TempData 的并发症。我没有编写原始代码,但它无法正常工作,我正在尝试修复它。我没有很多使用 TempData 和 ViewData 的经验。

我有一个索引操作如下(伪代码):

public virtual ActionResult Index()
{
   var vm = new IndexViewModel();

   // some code here to set up the ViewModel

   if (TempData.ContainsKey("Success"))
      vm.Success = true; 

   return View(MVC.Controller.Views.Index, vm);
}

我有一个 POST 操作如下(伪代码):
[HttpPost]
public virtual ActionResult Index(IndexViewModel vm, List<int> formData)
{
    if (DoSomethingWithData(formData))
    {
       TempData["Success"] = true;
       return RedirectToAction(MVC.Controller.ActionNames.Index);
    }

    TempData["Message"] = "Failed to use formData";

    return View(MVC.Controller.Views.Index, vm);
}

如果 vm.Success 为真,则 View 发出一个表单并以成功消息开头。如果存在,它还会在 TempData["Message"] 中发出消息。

我第一次来到这个页面时,我只得到了表格。我输入了 INVALID 表单数据并提交了它......我得到了以错误消息开头的表单,正如预期的那样。 (我知道这里的设计很糟糕,因为它没有重定向......并且你在刷新等方面获得了糟糕的用户体验,但我并不担心)这一切都很棒。

问题体现当我使用 VALID 表单数据时。如果我提交有效的表单数据,我会按预期返回以成功消息开头的页面,但是如果我刷新页面,成功消息仍然存在。事实上,如果我转到站点的完全不同的部分并返回,成功信息仍然存在。由于某种原因,重定向和读取后,临时数据仍然存在。既进行了重定向又进行了读取……临时数据现在不应该清楚吗?

我有理由确定我导航到的其他地方没有出于任何原因设置 TempData["Success"],但要确保我已经导航到 Google 之类的东西,并直接返回到此页面的 URL,似乎仍然填充了 TempData["Success"] 。

很明显,要么我不清楚 TempData 应该如何运行(不足为奇),要么发生了一些我根本没有经验可以看到的异常情况。

欢迎任何建议!

谢谢,
戴夫

[编辑]

当有成功消息时, View 实际上并不发出表单......它只发出成功消息。

View 看起来或多或少是这样的:
<% if (TempData.ContainsKey("Message")) { %>
   Emit message...
<% } %>

<% using (Html.BeginForm(MVC.Controller.ActionNames.Index, 
                         MVC.Controller.Name, 
                         FormMethod.Post, 
                         new { id = "form"})) { %>
   <% if (!Model.Success) { %>
      Emit form...
   <% } else { %>
      Emit confirmation message...
   <% } %>
<% } %>

弗朗西斯科向我指出了一些我没有考虑过的东西……但事实证明, View 模型的构造函数将 Success 设置为 false ……所以这并不奇怪。我确信 TempData["Success"] 仍然设置(而不是愚蠢地重用成功设置为 true 的 View 模型),因为我已经逐步完成了代码,并且它不断地进入设置 vm 的 if 语句。成功 = true,即使在刷新后也是如此。

最佳答案

Microsoft 对 TempData 的行为进行了更改,我们需要在 MVC 2 和 3 中注意这一点。现在,在 Controller 操作周期结束时,TempData 不再完全清除。 TempData 现在可以(自动且无需更改任何内容)持续到其他页面。 TempData 键现在只有在被读取后才会被清除。此外,如果您使用 RedirectResult 或 RedirectToRouteResult,即使它们被读取,它们也会持续存在。

以下是更多详细信息:warning-mvc-nets-tempdata-now-persists-across-screens

关于asp.net-mvc-2 - TempData 未按预期清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5953302/

相关文章:

c# - 没有模型和 Ajax 的 POST Json

c# - 如何将一个 ViewModel 转换为另一个 ViewModel?

json - 如何在 MVC 中的 Controller 和 View 之间传递日期时间?

asp.net - windows azure asp.net MVC2 中的 Multi-Tenancy

asp.net - Ninject 给出 NullReferenceException

c# - Mysql存储网站管理员权限

asp.net-mvc-2 - ASP>net MVC 可重用部分

从注册页面创建用户时,asp.net mvc 无法连接到 SqlServer

c# - Facebook SDK C# -

asp.net-mvc - 为什么在 Asp.net MVC 2 中的子操作中不允许重定向结果