【发布时间】:2010-03-26 20:37:01
【问题描述】:
我有一个 Web 表单 Web 应用程序 (asp.net 2.0)。当用户提交表单时,我的提交链接实际上消失了,因此他们无法再次提交。但是,他们可以按 F5,这会导致另一个插入数据库,这是我不希望发生的。
如果/当他们确实按 F5 告诉页面时我可以设置某种设置 - 不要再次提交?
【问题讨论】:
标签: asp.net forms submission
我有一个 Web 表单 Web 应用程序 (asp.net 2.0)。当用户提交表单时,我的提交链接实际上消失了,因此他们无法再次提交。但是,他们可以按 F5,这会导致另一个插入数据库,这是我不希望发生的。
如果/当他们确实按 F5 告诉页面时我可以设置某种设置 - 不要再次提交?
【问题讨论】:
标签: asp.net forms submission
听起来您正在回发到同一页面,然后插入数据库,然后再向用户重新显示同一页面,减去提交按钮?
如果是这种情况,解决问题的最简单方法是对同一页面执行 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。
【讨论】:
【讨论】:
你可以做几件事。在 ViewState 中存储一个布尔值。检查/设置属性。 将布尔值存储在 Session 中并检查/设置它。
在回发时,您设置该值,如果该值为 true,则阻止提交并引发/显示错误。
【讨论】:
最近有一篇关于Code Project 的文章介绍了一种通过使用 HttpModule、隐藏字段和一些 JavaScript 来处理不需要的刷新的方法。它可能不适合您,但它是一个不依赖 ViewState 或 Session 的绝妙解决方案。
【讨论】: