C# - 如果用户在插入记录后刷新页面,则会创建重复记录。我怎样才能防止这种情况发生?
对于页面上存在的任何其他功能来说都是如此。我不希望发回之前发生的最后一个事件再次发生。
This is true with any other functionality present on the page. I don't want the last event that happened before post back to happen again.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我相信你应该看看 PRG 模式 (Post/Redirect/Get )
在 ASP.NET 中:
MSDN,将用户重定向到另一个页面
关于 PRG 模式的一些重要注意事项:
I believe you should take a look at the PRG Pattern (Post/Redirect/Get)
In ASP.NET:
MSDN, Redirecting Users to Another Page
Few important notes regarding PRG pattern:
您应该了解 PRG(发布/重定向/获取)模式:
来源:http://en.wikipedia.org/wiki/Post/Redirect/Get
基本上,您需要在用户完成 POST 后通过 GET 请求进行重定向。
You should learn about the PRG (Post/Redirect/Get) pattern:
Source: http://en.wikipedia.org/wiki/Post/Redirect/Get
Basically you'll want to redirect via a GET request after the user has done a POST.
您可以在数据库中插入记录之前检查已存在的条件。
就像在存储过程中一样,您可以检查
是否不存在(从列名 ='test' 的表中选择 id)
开始
插入语句..
结尾
you can check already exist condition before inserting record in Database.
like in stored procedure you can check
if not exists (select id from table where column name ='test' )
begin
inser statement..
end
这是关于 PRG。避免这种情况的简单方法是将用户再次重定向到同一页面:
Page:
Update.aspx
这将在
中创建一个
和浏览器将创建一个redirect-header
>ResoinseGET
请求到Update.aspx
页面。如果用户刷新页面,将发送GET
。看:响应
作为重定向命令:REDIRECTGET
请求:GETGET
应答的响应
GET
,因此不会再次触发submit
This is about PRG. The simple way to avoid this is redirect user to same page again:
Page:
Update.aspx
This will create a
redirect-header
inResoinse
and browser will create aGET
request toUpdate.aspx
page. And if the User refresh the page, aGET
will be sent. Look:response
as a redirect-command : REDIRECTGET
request for same page to server : GETresponse
answered by aGET
GET
, so will not fires asubmit
again一个简单的方法是使用 javascript 在用户单击按钮时禁用该按钮。
当需要高安全性时,我用来避免刷新的一种方法是在会话中使用一个小“令牌”。
比方说,我们在会话中放入一个小的 32 位整数。
该页面将包含一个隐藏输入,其中包含我们的小整数标记。
每次收到页面请求时,我们都会将该令牌加一,并且在此之前,我们会检查与请求中收到的令牌是否相等。
如果它们匹配,则不是刷新。
如果不匹配,则进行刷新。
这也将阻止尝试使用浏览器按钮执行后退和下一步。
当然,当令牌不匹配时,页面应该更改,否则您将再次遇到刷新问题。
它应该显示类似“嘿,刷新返回或下一步不允许,按此处继续”。
为了提高安全性,您可以将该整数与常量值进行异或,该常量值取决于会话中某个常量的其他值。
A simple way is to use javascript to disable the button when the users click it.
A way I use to avoid refreshes when high security is needed, is the use of a small "token" in session.
Let's say, we put a small 32 bit integer in our session.
The page will contain an hidden input containing our small integer token.
Each time we receive the page request, we increment that token by one, and, before doing so, we check for equality with the one received in the request.
If they match, it is not a refresh.
If they don't match, it is a refresh.
This will also block attempt to do back and next with browser buttons.
Of course at the point that token don't matches, the page should change or you'll have again the refresh problem.
It should show something like "hey, refresh back or next not allowed, press here to continue".
For increased security, you can xor that integer with a costant value dependant for example on some other value that is constant in session.