ASP.NET MVC TempData 用于错误请求

发布于 2024-08-26 16:58:47 字数 275 浏览 7 评论 0原文

我使用 TempData 在重定向期间保留 ModelState(使用 MvcContrib 技术)。这很好用。然而,在极少数情况下,用户会中止请求,然后立即触发另一个请求(例如,快速单击另一个菜单项)。这会导致 ModelState 错误出现在该页面上,而该页面不属于该页面。

问题是 TempData 存储在 Session 中。这意味着任何请求都可以获取它,例如第一个到达服务器的请求。

有任何已知的解决方法吗?例如,将“目标页面”与保存的 ModelState 一起保留在 TempData 中。

I use TempData to keep ModelState during redirects (using MvcContrib technique). This works fine. However, in rare cases, user aborts request and then immediate fires another (e.g. quickly clicks on another menu item). This causes ModelState errors to appear on that page, for which it does not belong.

The problem is that TempData is stored in Session. This means, ANY request can grab it, e.g. the one that comes first to the server.

Are there any known workarounds? E.g. keep "destination page" in the TempData along with saved ModelState.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

猥︴琐丶欲为 2024-09-02 16:58:48

在我看来,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");
}

使用 Session 来实现您正在寻找的内容或添加一些唯一的 ID 来允许您识别正确的请求。

另一种可以代替 TempData 的常见技术是 在客户端上序列化模型(如果愿意的话,可以认为是一种 ViewState)。

In my opinion TempData should only be used in actions that redirect immediately. For example:

public ActionResult Index()
{
    TempData["foo"] = "bar";
    return RedirectToAction("About");
}

public ActionResult About() 
{
    var foo = TempData["foo"];
    return View();
}

You should avoid storing something into the TempData and render a view:

public ActionResult Index()
{
    TempData["foo"] = "bar";
    // bad :-(
    return View("About");
}

Use Session to achieve what you are looking for or add some unique ID that allow you to identify the correct request.

Another common technique you could use instead of TempData is to serialize the model on the client (a sort of a ViewState if you will).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文