C# - 如果用户在插入记录后刷新页面,则会创建重复记录。我怎样才能防止这种情况发生?

发布于 2024-12-10 11:56:33 字数 50 浏览 0 评论 0原文

对于页面上存在的任何其他功能来说都是如此。我不希望发回之前发生的最后一个事件再次发生。

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

卸妝后依然美 2024-12-17 11:56:33

我相信你应该看看 PRG 模式 (Post/Redirect/Get )

Post/Redirect/Get (PRG) 是 Web 开发人员的常见设计模式
帮助避免某些重复的表单提交并允许用户代理
使用书签和刷新按钮表现得更直观

在 ASP.NET 中:

  1. POST - 单击提交按钮会导致 HTTP POST
  2. REDIRECT + GET - HttpResponse.Redirect()

MSDN,将用户重定向到另一个页面

在服务器代码中,您可以通过调用以编程方式重定向
重定向方法。该方法向用户的浏览器发送一条命令
导致浏览器向目标页面发出 HTTP GET 命令。

关于 PRG 模式的一些重要注意事项:

!!! PRG 模式无法解决重复表单的所有场景
提交。 PRG 无法提交的一些已知的重复表单提交
解决方法是:

  • 如果网络用户返回网络表单并重新提交。
  • 如果网络用户在服务器响应加载之前多次单击提交按钮(可以通过使用 JavaScript 禁用
    第一次点击后的按钮)。
  • 如果由于服务器延迟,网络用户在初始提交完成之前刷新,导致重复的 HTTP POST 请求
    某些用户代理。
  • 如果恶意网络用户不顾客户端保护措施和典型浏览器行为而提交表单两次。

I believe you should take a look at the PRG Pattern (Post/Redirect/Get)

Post/Redirect/Get (PRG) is a common design pattern for web developers
to help avoid certain duplicate form submissions and allow user agents
to behave more intuitively with bookmarks and the refresh button

In ASP.NET:

  1. POST - Submit button click causes HTTP POST
  2. REDIRECT + GET - HttpResponse.Redirect()

MSDN, Redirecting Users to Another Page

In server code, you can programmatically redirect by calling the
Redirect method. The method sends a command to the user's browser that
causes the browser to issue an HTTP GET command for the target page.

Few important notes regarding PRG pattern:

!!! The PRG pattern cannot address every scenario of duplicate form
submission. Some known duplicate form submissions that PRG cannot
solve are:

  • if a web user goes back to the web form and resubmits it.
  • if a web user clicks a submission button multiple times before the server response loads (may be prevented by using JavaScript to disable
    the button after the first click).
  • if a web user refreshes before the initial submission has completed because of server lag, resulting in a duplicate HTTP POST request in
    certain user agents.
  • if a malicious web user submits the form twice despite client-side safeguards and typical browser behavior.
蘑菇王子 2024-12-17 11:56:33

您应该了解 PRG(发布/重定向/获取)模式:

Post/Redirect/Get (PRG) 是 Web 开发人员的常见设计模式
帮助避免某些重复的表单提交并允许用户代理
使用书签和刷新按钮表现得更直观。

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

基本上,您需要在用户完成 POST 后通过 GET 请求进行重定向。

You should learn about the PRG (Post/Redirect/Get) pattern:

Post/Redirect/Get (PRG) is a common design pattern for web developers
to help avoid certain duplicate form submissions and allow user agents
to behave more intuitively with bookmarks and the refresh button.

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.

泪意 2024-12-17 11:56:33

您可以在数据库中插入记录之前检查已存在的条件。

就像在存储过程中一样,您可以检查

是否不存在(从列名 ='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

天暗了我发光 2024-12-17 11:56:33

这是关于 PRG。避免这种情况的简单方法是将用户再次重定向到同一页面:

Page: Update.aspx

void btnUpdate_click(object sender, EventArgs e){
    // do your update here
    Response.Redirect("Update.aspx");
}

这将在 中创建一个 redirect-header >Resoinse 和浏览器将创建一个 GET 请求到 Update.aspx 页面。如果用户刷新页面,将发送GET。看:

  1. 用户提交表单:POST
  2. 服务器进行更新,返回重定向标头
  3. 浏览器接收响应作为重定向命令:REDIRECT
  4. 浏览器向服务器发送同一页面的 GET 请求:GET
  5. 浏览器收到 GET 应答的响应
  6. 如果用户刷新页面:浏览器的最后一个命令是GET,因此不会再次触发submit

This is about PRG. The simple way to avoid this is redirect user to same page again:

Page: Update.aspx

void btnUpdate_click(object sender, EventArgs e){
    // do your update here
    Response.Redirect("Update.aspx");
}

This will create a redirect-header in Resoinse and browser will create a GET request to Update.aspx page. And if the User refresh the page, a GET will be sent. Look:

  1. User submit the form : POST
  2. Server do updates, return a redirect-header
  3. Browser receives the response as a redirect-command : REDIRECT
  4. Browser sends a GET request for same page to server : GET
  5. Browser receives the response answered by a GET
  6. If user refreshes the page: Browsers last command was GET, so will not fires a submit again
少跟Wǒ拽 2024-12-17 11:56:33

一个简单的方法是使用 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文