如何防止重复的回发混淆我的业务层

时间:2009-01-26 22:01:52

标签: asp.net form-submit duplicate-data

我有一个带有传统3层设计的Web应用程序(ASP.Net 3.5)。如果用户单击按钮发生回发,则会运行一些中间和数据层代码,并刷新屏幕。如果用户在第一次回发完成之前多次单击该按钮,则我的逻辑会混淆,并且应用程序可能最终处于无效状态。 防止这种情况的最佳方法是什么?

我可以使用javascript来禁用按钮,但这只是隐藏了问题。如何构建我的业务和数据层来处理这个问题?

7 个答案:

答案 0 :(得分:2)

三种最常用的方法(通常串联使用)是:

    点击/按下
  1. Disable submit buttons;
  2. 使用POST+REDIRECT+GET来避免后退按钮问题;和
  3. Replace history in the browser所以你不能回去(但这应该谨慎使用并且有充分的理由)。

答案 1 :(得分:1)

如果我要诚实地说实话,我会说这听起来像是你对网络回发感到困惑的人,而不是你的应用程序(如果你是编写它的那个人)。 ; - )

那说,除了其他建议之外,在这种情况下我要做的是在表单中的隐藏字段中放置一个“标记” - 就像GUID一样 - 回发。使用它来跟踪正在完成的工作,只允许它使用一次。例如。回发后,将其放在会话存储中。每次执行回发时,首先检查会话是否有此令牌,如果它在那里,则不执行任何操作。如果不存在,请将其存储在会话中并完成工作。当会话结束时,令牌会自动丢弃。简单。比一些复杂的数据库令牌好多了。

  • [287]莪

答案 2 :(得分:0)

  1. 点击后禁用提交按钮。这样可以防止意外双击或更多
  2. 我经常重定向到回发后的 以避免意外/有意的页面刷新。
  3. 最后在您的数据库插入方法中,在执行插入之前检查在特定时间范围内插入的相同数据(可能以秒为单位)。如果发现在几秒钟​​内(或几分钟内发现重复数据。在您的情况下最有意义的话),请显示警告消息,如果用户认为不是错误,请让用户再次点击提交。 (当您拥有用户帐户并且用户在登录时提交数据时,此方法最有意义,因此将为用户执行重复数据检查。)

答案 3 :(得分:0)

从SO'r PostBack Ritalin中查看名为Dave Ward的ASP.NET AJAX控件。

答案 4 :(得分:0)

我已经解决了编写禁用点击功能按钮的JavaScript的问题:

MyButton.Attributes.Add("onclick",
    "javascript:this.onclick=function(){return false;};");

答案 5 :(得分:0)

我们都看到了点击它们时禁用“提交”按钮的网站。这通常是为了防止用户多次单击该按钮。 通常,这是使用'onclick'JavaScript事件来禁用按钮。在ASP.NET中,每个服务器端项都已经有一个onclick事件处理程序,它会调用服务器进行事件处理。 要在ASP.NET中完成同样的事情,您可以轻松地执行以下操作:

btnSubmit.Attributes.Add("onclick", "this.disabled=true;" + GetPostBackEventReference(btnSubmit).ToString());

其中'btnSubmit'是相关按钮的名称。这里发生的是我们创建一个onclick事件,它做两件事。首先,它禁用用户浏览器中的按钮。它做的第二件事是将正常的回发事件提交给服务器。

答案 6 :(得分:0)

即使我遇到了同样的问题,我也像下面一样解决了。

上传文件后如果您重定向到same pagesome other page in your project,则会避免此问题。

例如:

在我的ASPX中

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm.aspx.cs" Inherits="WebApplication.WebForm" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>

<body>
    <form id="form1" runat="server">
        <div>
            <asp:FileUpload ID="FileUpload1" runat="server" />
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        </div>
    </form>
</body>
</html>

即使我遇到了同样的问题,我也像下面一样解决了。

上传文件后如果您重定向到项目中的同一页面或其他页面。重定向后,重定向响应将不会出现在那里。

在我的ASPX中

    

                                                     

在我的代码背后

public partial class WebForm : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            string path = Server.MapPath("~");
            path = path + FileUpload1.FileName;
            FileUpload1.SaveAs(path);
            Response.Redirect("WebForm.aspx"); // Responce will be cleared. This Redirection will do the Trick 
            //Put the debugger and check it will work
        }
    }
  

此处,要显示成功和错误消息,请尝试使用会话。