我正在使用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为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...
<% } %>
<% } %>
弗朗西斯科向我指出了一些我没有考虑过的东西......但事实证明,viewmodel的构造函数将Success设置为false ...所以这并不奇怪。我确信TempData [“Success”]仍然是设置的(而不是愚蠢地重用成功设置为true的viewmodel)因为我已经逐步完成了代码并且它不断地进入if语句设置vm。 success = true,即使刷新后也是如此。
答案 0 :(得分:10)
Microsoft已经对MVC 2和3中需要注意的TempData行为进行了更改。在控制器操作周期结束时,TempData现在不再完全清除。 TempData现在可以(自动且无需更改任何内容)持久保存到其他页面。 TempData密钥现在只有在被读取后才会被清除。此外,如果使用RedirectResult或RedirectToRouteResult,即使它们被读取,它们也会一直存在。
以下是更多详情:warning-mvc-nets-tempdata-now-persists-across-screens
答案 1 :(得分:7)
正如我在评论中所说的那样添加这个。我建议做
if (TempData["Success"] != null)
vm.Success = true;
而不是
if (TempData.ContainsKey("Success"))
vm.Success = true;
...因此它被视为TempData读取。很高兴它奏效了。 此致