单击按钮时如何防止回发

时间:2014-06-26 03:58:38

标签: c# asp.net postback

我有一个将文件保存在数据库中的代码。我的代码背后有这个功能:

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"按钮,它将调用函数后面的代码并保存用户浏览的文件。它运行得很好,但是当我刷新页面时,它再次转到该函数并重复以记录副本结束的保存过程。我该如何避免这种情况发生?

我试过的一些是:

  1. 添加if (!IsPostBack) {}条件。
  2. 在我的按钮中添加onClientClick="return false"属性。
  3. 但它没有解决问题。提前谢谢。

2 个答案:

答案 0 :(得分:1)

使用此技术可以在刷新后阻止控制事件的双触发:

  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());
        }
    }
    
  4. 干杯

答案 1 :(得分:0)

您可以使用Post/Redirect/Get (PRG)模式来克服此问题。你可以在这里看到类似的问题。 how to prevent data from sending if user press F5 or refresh in asp.net?