【问题标题】:Preventing webform resubmission on browser refresh without losing viewstate防止在浏览器刷新时重新提交 web 表单而不丢失视图状态
【发布时间】:2010-10-07 05:40:56
【问题描述】:

重复: How can I prevent database being written to again when the browser does a reload/back?


如果用户从浏览器请求刷新,是否有一种优雅的方式来阻止 .aspx 页面重新提交表单数据?

理想情况下不会丢失视图状态。

编辑:对我来说最优雅的解决方案是把相关控件包装在一个 asp.net ajax UpdatePanel 中。塔大家。

【问题讨论】:

    标签: c# asp.net browser webforms


    【解决方案1】:

    【讨论】:

    • 我一直在寻找不会失去我的观点的东西。有什么办法保存吗?
    • 如果由于超时等原因导致重定向中断,仍然存在用户刷新初始URL,导致双重POST的危险。
    • 这仅适用于某些情况。
    【解决方案2】:

    生成一个唯一标识符并将其插入到同样存储在服务器上的页面中。在提交表单时存储它,不要让该值多次传递。

    更新:这是唯一“正确”的方法。当我这么说时,我的意思是在服务器端存储一些东西。任何基于客户端行为的东西都可能有问题。这些实现不关心潜在的浏览器错误、不兼容、禁用javascript、连接超时等。

    服务器端的某些东西需要知道这个特定的动作已经被执行并在服务器端停止它。我强调这一点,因为通常需要这样做以阻止客户刷新和制作多个订单(以及可能的多个账单)。这也允许客户端在服务器没有实际接收到并执行操作时优雅地刷新(例如,在超时的情况下)。

    【讨论】:

    • 如果 ASP.NET 可以选择自动打开这个唯一令牌,那不是很酷吗?
    • 如果用户同时打开多个浏览器窗口,这不是也很棘手吗?您可能需要跟踪每个窗口的多个唯一令牌,否则用户一旦在一个窗口上提交,就无法在其他窗口上提交。有没有优雅的解决方法?
    • @jm:您会为每个页面生成唯一标识符,而不是每个用户(我认为?)。
    • @Svish 为什么不简单地在请求上生成令牌,这样无论您打开了多少标签,它只会跟踪实际发出的请求(我的意思是特别是按钮点击等,而不是对图像和其他资产的字面 HTTP 请求)。 :)
    • @Chiramisu,不确定你在说什么,但我的意思是它应该每页生成一次,或者实际上每个表单生成一次。因此,只要您有一个表单,它就应该有一个<input type="hidden" name="identifier" value="{some-uniq-id}>,其中 id 也存储在会话中(或类似的)。表单发布后,您可以比较这两者以检查该表单是否已发布。只需记住在完成检查后将 id 从会话中删除,否则将无效。
    【解决方案3】:

    没有优雅的方法,但有选择。如其他答案之一所述,您可以执行 HTTP 重定向响应。另一种解决方案是通过 Ajax 或 iframe 等方式提交。

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 2020-07-28
      • 2011-02-16
      • 2014-07-29
      • 2011-12-21
      • 2019-07-20
      • 1970-01-01
      • 2015-03-05
      • 2018-01-21
      相关资源
      最近更新 更多