我有一个具有常规3层设计的Web应用程序(ASP.Net 3.5)。如果用户点击按钮回发,则会运行一些中间和数据层代码,并刷新屏幕。如果用户在第一次回发完成之前多次单击该按钮,我的逻辑就会感到困惑,应用程序最终会处于无效状态。 防止这种情况的最佳方法是什么?如何防止重复回发混淆我的业务层
我可以使用JavaScript来禁用按钮,但这只是隐藏了问题。我如何构建业务层和数据层来处理此问题?
我有一个具有常规3层设计的Web应用程序(ASP.Net 3.5)。如果用户点击按钮回发,则会运行一些中间和数据层代码,并刷新屏幕。如果用户在第一次回发完成之前多次单击该按钮,我的逻辑就会感到困惑,应用程序最终会处于无效状态。 防止这种情况的最佳方法是什么?如何防止重复回发混淆我的业务层
我可以使用JavaScript来禁用按钮,但这只是隐藏了问题。我如何构建业务层和数据层来处理此问题?
三种最流行的方法(其通常串联使用)为:
如果我是一个非常诚实的人,我会说这听起来像你是一个关于网络回发的人,而不是你的应用程序(如果你是那个人写的)。 ;-)
这就是说,除了其他建议,我会在这种情况下做一个“标记”在窗体的隐藏字段中 - 像一个GUID - 被张贴回来。使用它来跟踪正在完成的工作,只允许它使用一次。例如。当回发时,将其放置在会话存储中。每次执行回发时,首先检查该令牌的会话,如果有,则不做任何事情。如果不存在,请将其存储在会话中并完成工作。会话结束时,令牌会自动丢弃。简单。比一些令人费解的数据库令牌更好。
我正在做一些与memcached非常类似的令牌。将GUID作为隐藏字段包含在表单中,然后在发布时尝试将其添加到memcached。如果添加失败,它已经被添加,所以什么也不做。这些密钥在很短的时间后过期,memcached不可靠,但我已经实现了redirect-post-post,只需要处理偶尔双击提交按钮(通常由大老板......) ) – 2010-02-02 17:36:24
看看这个ASP.NET AJAX控件调用PostBack Ritalin从老乡SO'r Dave Ward。
我已经解决了这个问题写一个javascript禁用点击功能按钮:
MyButton.Attributes.Add("onclick",
"javascript:this.onclick=function(){return false;};");
,当你点击它们,我们都看到,禁用“提交”按钮的网站。这通常是为了防止用户多次点击按钮。 通常,这是通过使用'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
在我的C颂歌背后
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
}
}
这里,展示的成功和错误消息尝试使用会话。
我问过类似的问题,然后回来... http://stackoverflow.com/questions/305684/how-can-i-prevent-database-being-written-to-again-when-the-browser -does-a-reload – Marty 2009-01-26 22:29:01