【问题标题】:ASP.NET MVC TempData used for wrong request用于错误请求的 ASP.NET MVC TempData
【发布时间】:2010-03-25 12:06:59
【问题描述】:

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

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

是否有任何已知的解决方法?例如。在 TempData 中保留“目标页面”以及保存的 ModelState。

【问题讨论】:

    标签: asp.net-mvc tempdata


    【解决方案1】:

    在我看来,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,以便您识别正确的请求。

    您可以使用的另一种常用技术来代替TempDataserialize the model on the client(如果您愿意,可以使用一种 ViewState)。

    【讨论】:

    • 我的问题正是关于“立即重定向的操作”。如果我在分配临时数据后只渲染视图,问题就不会发生。并且 TempDate DO 使用 Session 所以这个建议没有意义。真正的问题是没有“立即重定向”之类的东西 - 由用户点击引起的另一个请求可以中止它并下一个。至于在视图中序列化ModelState,我想过,但是感谢链接。
    • 不,我无法在视图中进行序列化。流程是“获取 POST - 检查错误 - 设置 ModelState - 重定向到显示消息的页面”。 “检查错误”和“显示消息的页面”之间没有“视图”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多