【问题标题】:asp.net prevent form submission twiceasp.net 两次阻止表单提交
【发布时间】:2010-03-26 20:37:01
【问题描述】:

我有一个 Web 表单 Web 应用程序 (asp.net 2.0)。当用户提交表单时,我的提交链接实际上消失了,因此他们无法再次提交。但是,他们可以按 F5,这会导致另一个插入数据库,这是我不希望发生的。

如果/当他们确实按 F5 告诉页面时我可以设置某种设置 - 不要再次提交?

【问题讨论】:

标签: asp.net forms submission


【解决方案1】:

听起来您正在回发到同一页面,然后插入数据库,然后再向用户重新显示同一页面,减去提交按钮?

如果是这种情况,解决问题的最简单方法是对同一页面执行 Response.Redirect() - 因此当用户按 F5 时,它会将 GET 请求重新加载到页面而不是 POST。

说明:

当您在 ASP.NET 中执行回发时,浏览器将向服务器发送 POST request。我不知道您在 HTTP 方法方面的背景,但即使您是 Web 编程新手,您也可能已经体验过这些类型的请求在浏览器中的影响。有时当您在网站上提交表单并点击返回按钮时,它会说“您想重新提交表单数据”之类的内容。这是因为这些表单使用 HTTP POST 方法向服务器发送数据。在这种情况下,后退按钮的效果与您按 F5 时相同 - 浏览器再次重复完全相同的 POST 请求(这需要某种类型的表单数据,在这些情况下,它与您上次提交的数据相同时间)。

当您使用Response.Redirect() 时,服务器将发出HTTP status code 302(资源临时移动)以响应请求。然后,浏览器现在将对它被告知重定向到的资源发出 GET 请求(在这种情况下,您的页面完全相同)。

现在,当您在页面上时,它会像您从链接访问它或直接在地址栏中输入一样返回。如果这次按 F5,将发出 GET 请求而不是 POST。

我会推荐你​​download Firebug 并激活“网络”面板。您可以准确查看请求/响应的构成内容以及页面上发出的所有请求的列表。

更多资源:

如果您喜欢冒险,可以查看even more status codes(顺便说一下,我实际上在我正在开发的应用程序中使用了 418 来绕过 ASP.NET 的表单身份验证)。

如果 Firebug 还不够,您可以下载 Fiddler 并根据自己的喜好实际制作和重播请求。

如果 GET 和 POST 对您来说还不够,您可以使用其他方法来更改应用程序中的状态。您可能听说过RESTful architecture,它基本上按照预期使用 HTTP 方法 GET、PUT、POST 和 DELETE。

【讨论】:

  • 约翰,你所描述的正是我正在做的。你建议把 Response.Redirect() 放在哪里,这样我就清楚了。现在我基本上是在 Page_Load 中这样做的。如果 Request.Form[my button] == "按钮的名称"...然后调用一些方法插入数据。
  • 这似乎行得通。我不完全清楚为什么。或许多解释一点?很少有其他回应建议使用会话变量和其他似乎更复杂的方法来做事。这个 Response.Redirect() 解决方案是否有问题。如果没有,实现起来似乎要简单得多。
  • 约翰,感谢您提供的信息。我在这里肯定有一些学习要做,感谢回复中的时间和体贴。有帮助。出于好奇,因为我将使用您现在提到的 Redirect() 方法。有没有办法向用户显示一条消息,例如已经提交的数据,并实际检测到他们正在做的事情是在已经提交数据后按 F5 键?再次感谢。
【解决方案2】:

你可以试试这个。如果它不符合您的需求,至少了解一下是件好事。

发布 - 重定向 - 获取

http://en.wikipedia.org/wiki/Post/Redirect/Get

【讨论】:

    【解决方案3】:

    你可以做几件事。在 ViewState 中存储一个布尔值。检查/设置属性。 将布尔值存储在 Session 中并检查/设置它。

    在回发时,您设置该值,如果该值为 true,则阻止提交并引发/显示错误。

    【讨论】:

    • 他要避免重新按下 F5,而不是再次单击按钮 - 在这种情况下,简单地禁用按钮就是避免双输入。
    【解决方案4】:

    最近有一篇关于Code Project 的文章介绍了一种通过使用 HttpModule、隐藏字段和一些 JavaScript 来处理不需要的刷新的方法。它可能不适合您,但它是一个不依赖 ViewState 或 Session 的绝妙解决方案。

    【讨论】:

    • 我阅读并测试了这个解决方案,如果 javascript 无法运行,就会遇到问题。无论如何都是好主意。
    猜你喜欢
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2018-11-07
    • 2020-10-06
    • 2017-02-10
    • 2016-02-20
    相关资源
    最近更新 更多