自从我一直在使用它,这是我的理解,在MVC中,您在TempData中放置的任何内容都是...暂时的。它仅在当前请求的持续时间内存在,然后在请求完成并发送响应后消失。
为了通过POST-Redirect-GET周期保留模型状态错误,我使用了 asgeo1 的答案发布在这里:
ASP.NET MVC - How to Preserve ModelState Errors Across RedirectToAction?
我认为这很好用,但是在我的最新项目(VS 2015)中发现临时数据实际上仍然存在。
场景:用户在“搜索”中输入的文本中输入值,提交帖子,然后重定向到另一个页面“索引”。然后,他们单击链接返回到搜索。
Search.cshtml:
@model Foo.Models.TestModel
<form method="post" action="@Url.Content("~/Home/Search")">
@Html.TextBoxFor(o => o.TestString)
<input name="find" type="submit" value="Search" />
</form>
Index.cshtml:
<a href="@Url.Content("~/Home/Search")">Search</a>
控制器:
[HttpGet]
[RestoreModelStateFromTempData]
public ActionResult Search(TestModel model)
{
//var modelState = TempData["ModelState"] as ModelStateDictionary;
//if (modelState != null)
// throw new Exception("Temp Data should be empty.");
return View(model);
}
[HttpPost]
[SetTempDataModelState]
public ActionResult Search(TestModel_Post model)
{
return RedirectToAction("Index", "Home", null);
}
[HttpGet]
public ActionResult Index() { return View(); }
令我惊讶的是,保留了前一篇文章中的临时数据,并且合并了其中的模型状态,用户看到了他们输入的最后一个值。这是对该页面的全新导航-这里应该没有临时数据。
一种解决方法是清除模型状态(如果有效)。但这令我震惊-我觉得我不再了解TempData。
这是怎么回事?
答案 0 :(得分:0)
您在ViewData和TempData之间是错误的。
ViewData
仅将数据从控制器传输到视图,反之亦然。仅在当前请求期间有效。
ViewData
可用于将数据从Controller
传输到View
。
TempData
可用于存储可在后续请求中使用的临时数据。 后续请求完成后
TempData
在要将非敏感数据从一种动作方法转移到相同或不同控制器以及redirects