2009-01-26 45 views
6

我有一个具有常规3层设计的Web应用程序(ASP.Net 3.5)。如果用户点击按钮回发,则会运行一些中间和数据层代码,并刷新屏幕。如果用户在第一次回发完成之前多次单击该按钮,我的逻辑就会感到困惑,应用程序最终会处于无效状态。 防止这种情况的最佳方法是什么?如何防止重复回发混淆我的业务层

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

+0

我问过类似的问题,然后回来... 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

回答

1

如果我是一个非常诚实的人,我会说这听起来像你是一个关于网络回发的人,而不是你的应用程序(如果你是那个人写的)。 ;-)

这就是说,除了其他建议,我会在这种情况下做一个“标记”在窗体的隐藏字段中 - 像一个GUID - 被张贴回来。使用它来跟踪正在完成的工作,只允许它使用一次。例如。当回发时,将其放置在会话存储中。每次执行回发时,首先检查该令牌的会话,如果有,则不做任何事情。如果不存在,请将其存储在会话中并完成工作。会话结束时,令牌会自动丢弃。简单。比一些令人费解的数据库令牌更好。

  • [287]莪
+0

我正在做一些与memcached非常类似的令牌。将GUID作为隐藏字段包含在表单中,然后在发布时尝试将其添加到memcached。如果添加失败,它已经被添加,所以什么也不做。这些密钥在很短的时间后过期,memcached不可靠,但我已经实现了redirect-post-post,只需要处理偶尔双击提交按钮(通常由大老板......) ) – 2010-02-02 17:36:24

0
  1. 禁用提交按钮一次点击。这将防止意外双击或更多
  2. 我通常重定向到不同的URL 后回发,以避免意外/故意的页面刷新。
  3. 最后在您的数据库插入方法中,在插入前检查在特定时间范围内插入的相同数据(可能以秒为单位)。如果在几秒(或几分钟内)内发现重复数据被插入,那么显示警告消息并让用户再次点击提交,如果用户认为它没有错误。 (这种方法最有意义,当你有用户账号和登录时用户提交的数据,因此重复数据检查用户完成。)
0

我已经解决了这个问题写一个javascript禁用点击功能按钮:

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

,当你点击它们,我们都看到,禁用“提交”按钮的网站。这通常是为了防止用户多次点击按钮。 通常,这是通过使用'onclick'JavaScript事件来禁用按钮来完成的。在ASP.NET中,每个服务器端项目都有一个onclick事件处理程序,它将服务器调回以进行事件处理。 为了实现在ASP.NET同样的事情,你可以很容易做到:

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

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

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

在我的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 
     } 
    } 

这里,展示的成功和错误消息尝试使用会话。