我有一个带有传统3层设计的Web应用程序(ASP.Net 3.5)。如果用户单击按钮发生回发,则会运行一些中间和数据层代码,并刷新屏幕。如果用户在第一次回发完成之前多次单击该按钮,则我的逻辑会混淆,并且应用程序可能最终处于无效状态。 防止这种情况的最佳方法是什么?
我可以使用javascript来禁用按钮,但这只是隐藏了问题。如何构建我的业务和数据层来处理这个问题?
答案 0 :(得分:2)
三种最常用的方法(通常串联使用)是:
答案 1 :(得分:1)
如果我要诚实地说实话,我会说这听起来像是你对网络回发感到困惑的人,而不是你的应用程序(如果你是编写它的那个人)。 ; - )
那说,除了其他建议之外,在这种情况下我要做的是在表单中的隐藏字段中放置一个“标记” - 就像GUID一样 - 回发。使用它来跟踪正在完成的工作,只允许它使用一次。例如。回发后,将其放在会话存储中。每次执行回发时,首先检查会话是否有此令牌,如果它在那里,则不执行任何操作。如果不存在,请将其存储在会话中并完成工作。当会话结束时,令牌会自动丢弃。简单。比一些复杂的数据库令牌好多了。
答案 2 :(得分:0)
答案 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 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
}
}
此处,要显示成功和错误消息,请尝试使用会话。