我有一个Web表单Web应用程序(asp.net 2.0)。当用户提交表单时,我的提交链接实际上已经消失,因此他们无法再次提交。但是,他们可以按F5,这会导致另一个插入数据库,我不想发生这种情况。
如果/当他们按F5告诉页面时,是否有我可以设置的某种设置 - 不再提交?
答案 0 :(得分:14)
听起来你正在对同一页面进行回发,然后在将同一页面重新显示给用户之前插入数据库,减去提交按钮?
如果是这种情况,解决问题的最简单方法是对同一页面执行Response.Redirect()
- 因此当用户按下F5时,它会将GET请求重新加载到页面而不是POST。 / p>
当您在ASP.NET中进行回发时,浏览器会向服务器发送POST request。我不知道你在HTTP方法中的背景,但即使你是网络编程的新手,你也可能在浏览器中体验过这些类型的请求的影响。有时,当您在网站上提交表单并点击后退按钮时,会说“您想重新提交表单数据”。这是因为这些表单使用HTTP POST方法将数据发送到服务器。在这种情况下后退按钮的效果与按F5时相同 - 浏览器重复完全相同的POST请求(这需要某种类型的表单数据,在这些情况下,它与您最后提交的数据相同时间)。
当您使用Response.Redirect()
时,服务器正在发出HTTP status code 302(暂时移动资源)以响应请求。然后,浏览器将发出一个GET请求,告知它已被告知要重定向到的资源(在这种情况下,是同一页面)。
现在,当您在页面上时,它会被返回,就像您从链接访问它或直接将其键入地址栏一样。如果您这次按F5,将发出GET请求而不是POST。
我会向您推荐download Firebug并激活“Net”面板。您可以准确地查看撰写请求/响应的内容以及页面上所有请求的列表。
如果您有冒险精神,可以查看even more status codes(以及我在应用程序中实际使用418的方式,我正在努力解决ASP.NET的Forms身份验证问题)。
如果Firebug不够,您可以下载Fiddler并实际手动并重播您喜欢的请求。
如果GET和POST不够,您可以使用其他方法更改应用程序中的状态。您可能听说过RESTful architecture,它基本上使用了HTTP方法GET,PUT,POST和DELETE。
答案 1 :(得分:5)
答案 2 :(得分:0)
你可以做几件事。在ViewState中存储布尔值。检查/设置属性。 将布尔值存储在Session中并检查/设置它。
在回发时,您设置值,如果值为true,则阻止提交并引发/显示错误。
答案 3 :(得分:0)
最近有一篇关于Code Project的文章介绍了一种通过使用HttpModule,隐藏字段和一些JavaScript来处理不需要的刷新的方法。它可能不适合您,但它是一个不依赖于ViewState或Session的漂亮解决方案。