我使用TempData在重定向期间保持ModelState(使用MvcContrib技术)。这很好用。但是,在极少数情况下,用户会中止请求,然后立即触发另一个请求(例如,快速点击另一个菜单项)。这会导致ModelState错误出现在该页面上,而不属于该页面。
问题是TempData存储在Session中。这意味着,任何请求都可以抓住它,例如首先来到服务器的那个。
有任何已知的解决方法吗?例如。保留TempData中的“目标页面”以及保存的ModelState。
答案 0 :(得分:2)
我认为TempData
应该仅在立即重定向的操作中使用。例如:
public ActionResult Index()
{
TempData["foo"] = "bar";
return RedirectToAction("About");
}
public ActionResult About()
{
var foo = TempData["foo"];
return View();
}
您应避免将某些内容存储到TempData中并呈现视图:
public ActionResult Index()
{
TempData["foo"] = "bar";
// bad :-(
return View("About");
}
使用会话来实现您的目标或添加一些唯一ID,以便您识别正确的请求。
您可以使用的另一种常用技术代替TempData
是serialize the model on the client(如果您愿意,可以使用某种ViewState)。