我有一个采用传统 3 层设计的 Web 应用程序(ASP.Net 3.5)。如果用户单击一个按钮,则会发生回发,一些中间层和数据层代码会运行,并且屏幕会刷新。如果用户在第一次回发完成之前多次单击该按钮,我的逻辑会变得混乱,并且应用程序可能最终处于无效状态。防止这种情况的最佳方法是什么?
我可以使用 javascript 来禁用按钮,但这只是隐藏了问题。我如何构建我的业务和数据层来处理这个问题?
我有一个采用传统 3 层设计的 Web 应用程序(ASP.Net 3.5)。如果用户单击一个按钮,则会发生回发,一些中间层和数据层代码会运行,并且屏幕会刷新。如果用户在第一次回发完成之前多次单击该按钮,我的逻辑会变得混乱,并且应用程序可能最终处于无效状态。防止这种情况的最佳方法是什么?
我可以使用 javascript 来禁用按钮,但这只是隐藏了问题。我如何构建我的业务和数据层来处理这个问题?
三种最流行的方法(经常串联使用)是:
如果说实话,我会说这听起来像是您对网络回发感到困惑,而不是您的应用程序(如果您是编写它的人)。;-)
也就是说,除了其他建议之外,在这种情况下,我要做的是在表单的隐藏字段中放置一个“令牌” - 就像一个 GUID - 被发回。使用它来跟踪正在完成的工作,并且只允许它被使用一次。例如,在回发时,将其放在会话存储中。每次执行回发时,首先检查会话是否有此令牌,如果存在则什么也不做。如果它不存在,请将其存储在会话中并完成工作。会话结束时,令牌会自动丢弃。简单的。比一些复杂的数据库令牌要好得多。
我已经解决了编写禁用单击功能按钮的javascript的问题:
MyButton.Attributes.Add("onclick",
"javascript:this.onclick=function(){return false;};");
查看来自 SO'r Dave Ward的这个名为PostBack Ritalin的 ASP.NET AJAX 控件。
我们都见过在您单击它们时禁用“提交”按钮的网站。通常这样做是为了防止用户多次单击该按钮。通常这是使用'onclick' JavaScript 事件来禁用按钮来完成的。在 ASP.NET 中,每个服务器端项都已经有一个 onclick 事件处理程序,该处理程序回调服务器进行事件处理。要在 ASP.NET 中完成同样的事情,您可以轻松地执行以下操作:
btnSubmit.Attributes.Add("onclick", "this.disabled=true;" + GetPostBackEventReference(btnSubmit).ToString());
其中“btnSubmit”是相关按钮的名称。这里发生的是我们创建了一个 onclick 事件,它做两件事。首先,它禁用用户浏览器中的按钮。它所做的第二件事是将正常的回发事件提交给服务器。
即使我遇到了同样的问题,我也已经解决了,如下所示。
上传文件后如果您重定向到same page
或some 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
}
}
在这里,为了显示成功和错误消息,请尝试使用会话。