TempData未按预期清除

Mir*_*Mir 7 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);
}
Run Code Online (Sandbox Code Playgroud)

我有一个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);
}
Run Code Online (Sandbox Code Playgroud)

如果vm.Success为true,则视图将发出一个表单并在其前面显示成功消息.如果它存在,它还将在TempData ["Message"]中发出消息.

我第一次来到页面时,我得到了表单.我输入INVALID表单数据并提交...我得到的表单前面有错误消息,如预期的那样.(我知道这里的设计很差,因为它没有重定向......而且你的刷新等用户体验很差,但是我还没有担心)这一切都很棒.

当我使用VALID表单数据时,问题就会出现.如果我提交有效的表单数据,我会按照预期的那样在页面前面显示成功消息,但如果我刷新页面,则成功消息仍然存在.事实上,如果我去网站的一个完全不同的部分并导航回来,成功的信息仍然存在.由于某种原因,重定向和读取后,tempdata仍然存在.有重定向和读取...现在不应该清楚临时数据吗?

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

很明显,要么我不清楚地理解TempData应该如何运作(不足为奇),要么发生一些不寻常的事情,我根本没有经验可以看到.

欢迎任何建议!

谢谢,戴夫

[编辑]

当有成功消息时,视图实际上不会发出表单...它只发出成功消息.

视图看起来或多或少像这样:

<% 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...
   <% } %>
<% } %>
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*vus 10

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

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


Fra*_*sco 7

正如我在评论中所说的那样添加这个.我建议做

if (TempData["Success"] != null) 
    vm.Success = true;
Run Code Online (Sandbox Code Playgroud)

代替

if (TempData.ContainsKey("Success"))
      vm.Success = true; 
Run Code Online (Sandbox Code Playgroud)

...因此它被视为TempData读取.很高兴它奏效了.问候