如何防止在单击按钮时回发

本文关键字:按钮 单击 何防止 | 更新日期: 2023-09-27 18:10:16

我有一个代码,在数据库中保存文件。在我的代码后面有这个函数:

protected void AttachFile(object sender, EventArgs e)
    {
        if (txtFile.HasFile)
        {
            string filename = Path.GetFileName(txtFile.PostedFile.FileName);
            string contentType = txtFile.PostedFile.ContentType;
            using (Stream fs = txtFile.PostedFile.InputStream)
            {
                using (BinaryReader br = new BinaryReader(fs))
                {
                    Random ran = new Random();
                    byte[] bytes = br.ReadBytes((Int32)fs.Length);
                    NewRequestService newrequest = new NewRequestService();
                    string temp_id = "";
                    temp_id = ran.Next(100000, 999999).ToString();
                    saveAttachFile(filename, contentType, bytes, temp_id);
                    hdnAttachID.Value = temp_id;
                    lblAttach.InnerHtml = msg;
                }
            }
        }
        else { lblAttach.InnerHtml = "'"Please browse the file to attach.'""; }
    }
这是我的HTML:
<asp:Button ID="btnAttached" runat="server" Text="Attach File" OnClick="AttachFile" />
<asp:FileUpload ID="txtFile" size="46" runat="server" />

只需单击"Attach File"按钮,它将调用code behind函数并保存用户浏览的文件。它工作得很好,但当我刷新页面时,它再次转到函数,并重复保存过程,以重复记录结束。我怎样才能避免这种情况发生呢?

我试过的有:

  1. 添加if (!IsPostBack) {}条件。
  2. 添加onClientClick="return false"属性在我的按钮。

但这并没有解决问题。

如何防止在单击按钮时回发

使用此技术来防止刷新后控件事件的双重触发:

  1. 将此代码添加到PreRender事件页后面的代码

    protected void Page_PreRender(object sender, EventArgs e)
    {
        ViewState["CheckRefresh"] = Session["CheckRefresh"];
    }
    
  2. 在您的Page_Load事件中添加这一行。

    protected void Page_Load(object sender, EventArgs e)
    {
      if (!IsPostBack)
      {
        Session["CheckRefresh"] = Server.UrlDecode(System.DateTime.Now.ToString());
        // rest of your code here ...
      }
    }
    
  3. 在您的控件事件中,如您的按钮单击或任何其他您希望在页面刷新时防止此事件的控件,请先检查这些条件。

    protected void AttachFile(object sender, EventArgs e)
    {
        if (Session["CheckRefresh"].ToString() == ViewState["CheckRefresh"].ToString())
        {
           // your code starts here ..
           if (txtFile.HasFile)
           {
              //...
           }
           // your code ends here ..
           Session["CheckRefresh"] = Server.UrlDecode(System.DateTime.Now.ToString());
        }
    }
    

欢呼

您可以使用Post/Redirect/Get (PRG)模式来克服这个问题。你可以在这里看到一个类似的问题。如果用户在asp.net中按F5或刷新,如何防止数据发送?