6

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

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

4

7 回答 7

2

三种最流行的方法(经常串联使用)是:

  1. 单击/按下后禁用提交按钮
  2. 使用POST+REDIRECT+GET避免返回按钮问题;和
  3. 替换浏览器中的历史记录,这样您就无法返回(但这应该谨慎使用,并且有充分的理由)。
于 2009-01-26T22:03:56.580 回答
1

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

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

  • 奥辛
于 2009-01-26T22:12:30.383 回答
0

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

MyButton.Attributes.Add("onclick",
    "javascript:this.onclick=function(){return false;};");
于 2009-07-23T14:32:47.663 回答
0
  1. 单击后请禁用提交按钮。这将防止意外双击或更多
  2. 我通常在回发后重定向到不同的 URL ,以避免意外/有意的页面刷新。
  3. 最后在您的数据库插入方法中,在插入之前检查在特定时间范围内(可能以秒为单位)插入的相同数据。如果在几秒钟(或几分钟。在您的情况下最有意义的任何时间)内发现插入重复数据,则显示警告消息并让用户再次点击提交,如果用户认为它没有错误。(当您有用户帐户并且用户在登录时提交数据时,此方法最有意义,因此会为用户完成重复数据检查。)
于 2009-01-26T22:14:46.340 回答
0

查看来自 SO'r Dave Ward的这个名为PostBack Ritalin的 ASP.NET AJAX 控件。

于 2009-04-07T16:46:35.020 回答
0

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

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

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

于 2012-05-09T05:17:47.243 回答
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
        }
    }

在这里,为了显示成功和错误消息,请尝试使用会话。

于 2013-05-27T14:34:14.280 回答