Asp.net mvc 2 TempData未按预期清除

Asp.net mvc 2 TempData未按预期清除,asp.net-mvc-2,Asp.net Mvc 2,我正在使用ASP.NET4.0和MVC2.0开发一个应用程序。如果它在任何方面相关,我使用VS2010 我在使用TempData时遇到了麻烦。我没有编写原始代码,但它工作不正常,我正在尝试修复它。我没有很多使用TempData和ViewData的经验 我有如下索引操作(伪代码): 我有一个POST操作如下(伪代码): [HttpPost] 公共虚拟操作结果索引(IndexViewModel vm,List formData) { if(DoSomethingWithData(formData))

我正在使用ASP.NET4.0和MVC2.0开发一个应用程序。如果它在任何方面相关,我使用VS2010

我在使用TempData时遇到了麻烦。我没有编写原始代码,但它工作不正常,我正在尝试修复它。我没有很多使用TempData和ViewData的经验

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

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

[HttpPost]
公共虚拟操作结果索引(IndexViewModel vm,List formData)
{
if(DoSomethingWithData(formData))
{
TempData[“Success”]=true;
返回重定向到操作(MVC.Controller.ActionNames.Index);
}
TempData[“Message”]=“未能使用formData”;
返回视图(MVC.Controller.Views.Index,vm);
}
如果vm.success为true,则视图将发出一个表单并在其前面显示一条成功消息。如果存在TempData[“message”]中的消息,它也将发出该消息

我第一次浏览网页时,只看到了表格。我输入无效的表单数据并提交。。。我得到了一个以错误消息开头的表单。(我知道这里的设计很差,因为它没有重定向…而且刷新等方面的用户体验很差,但我还不担心)这一切都很好

当我使用有效的表单数据时,问题就会显现出来。如果我提交了有效的表单数据,我会像预期的那样在页面前面添加一条成功消息,但是如果我刷新页面,成功消息仍然存在。事实上,如果我去了网站的另一个完全不同的地方并导航回来,成功的信息仍然存在。由于某种原因,在重定向和读取之后,tempdata仍然存在。有一个重定向和一个读取。。。温度数据现在不应该是清晰的吗

我可以合理地确定,我导航到的其他地方没有出于任何原因设置TempData[“Success”],但可以肯定的是,我已经导航到了谷歌之类的东西,并直接返回到这个页面的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...
   <% } %>
<% } %>

发出消息。。。
发射形式。。。
发出确认消息。。。

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

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


这里有更多的细节:

正如我在评论中所说,只是添加了这个。我建议这样做

if (TempData["Success"] != null) 
    vm.Success = true;
而不是

if (TempData.ContainsKey("Success"))
      vm.Success = true; 
。。。因此,它算作临时数据读取。很高兴它起作用了。
关于

您确定tempdata未被清除吗?i、 你和调试器核对过了吗?你能在视图plz中显示成功消息的地方发布代码吗?我已经编辑了原始帖子,为视图添加了伪代码。嗯。。。我认为缺少了一些重要的东西。如果发出确认消息,是否传递更多值?我试图找到“IndexViewModel”和“ViewModelClass”之间的关系。它们是一样的吗?有了您发布的代码,它应该可以正常工作。我找不到任何奇怪的东西。如果你能发布原始代码,那将非常感谢。谢谢你的关注。我不能发布原始代码,因为它是为了工作。我意识到,当我编写伪代码时,很可能是在抽象出问题的根源。你说它应该按照我期望的方式工作,而不是我描述它实际工作的方式,这一事实非常有用。我必须更深入地研究它,并开始切割片段,直到它与我的伪代码几乎相同,然后看看会发生什么。哦,ViewModelClass和IndexViewModel也是一样的。我搞砸了伪编码,给了他们两个不同的名字。我将编辑原始帖子来解决这个问题。我已经发现了这个信息,形式不完整。我是从数据中读取的,所以在这方面应该被清除。。。我正在使用RedirectToAction(),它不应该调用。Keep()。。。但我会仔细看看这些信息,看看是否有用。谢谢+1谢谢,我很惊讶关于这方面的文档太少了
if (TempData["Success"] != null) 
    vm.Success = true;
if (TempData.ContainsKey("Success"))
      vm.Success = true;