【问题标题】:ASP.NET. HTML button causes a postback after exporting Excel fileASP.NET。 HTML 按钮在导出 Excel 文件后导致回发
【发布时间】:2015-02-18 14:03:08
【问题描述】:

我的 asp.net Web 表单中有 asp.net 服务器按钮控件和 html 按钮。

<asp:LinkButton runat="server" ID="btnExportToExcel" OnClick="btnExportToExcel_Click">Excel</asp:LinkButton>
<button type="submit" class="btn btn-info btn-block">Refresh</button>

我使用 asp.net 按钮 OnClick 事件发回 Excel 文件。下面是代码:

 protected void btnExportToExcel_Click(object sender, EventArgs e)
 {
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    Response.AddHeader("content-disposition", "attachment;  filename=ExcelDemo.xlsx");
    Response.BinaryWrite(ExcelHelper.GetByteArray(datatable));
    Response.End();
 }

导出到 Excel 工作正常,但导出完成后,所有 html 按钮开始导致回发,目标 id 为负责 Excel 导出的 asp.net 按钮控件,即 @ 的 OnClick 事件987654324@ 按钮再次被触发,我再次导出相同的 Excel 文件。

我对@9​​87654325@ 事件中的响应做错了吗?还是我错过了其他东西?

注意。我可以通过仅使用 asp.net 按钮来解决问题,但我想了解问题的性质。

编辑。在伊戈尔的回复之后,问题与响应无关(即我认为响应可能缺少某些东西)是否正确,并且它可以被认为是预期的行为,我需要小心我的按钮采用?

【问题讨论】:

    标签: c# asp.net excel postback response


    【解决方案1】:

    这是您页面上发生的情况:

    1. asp:LinkButton 被点击。在它的客户端单击它调用__doPostBack 将隐藏的__EVENTTARGET 输入值设置为btnExportToExcel

    2. 表单已提交到服务器。浏览器正在等待新内容的到来。

    3. 新内容是一个可下载的文件,因此浏览器页面不会被清除并保持提交期间的状态。

    4. 单击带有type="submit" 的任何按钮会导致带有__EVENTTARGET 的表单提交仍然具有btnExportToExcel 值。

    5. 服务器端页面将带有Request.Form["__EVENTTARGET"]="btnExportToExcel"POST请求解释为btnExportToExcel的点击。

    【讨论】:

    • 非常感谢您的解释。如何防止这种行为发生,即如何“清除”第 4 步中的 __EVENTTARGET?
    • @IgorShch - 您已经建议了一种避免这种情况的方法(在您的问题结束时)。您可以尝试将 javascript onclick 处理程序添加到 html 按钮并清除 __EVENTTARGET 输入。
    • 非常感谢您的帮助。我试图为我的公司创建一个可重复使用的“导出到 Excel”解决方案,所以我更担心其他人会重复使用它并面临同样的问题。
    【解决方案2】:

    我在开头缺少Response.Clear

    protected void btnExportToExcel_Click(object sender, EventArgs e)
    {
        Response.Clear();
        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        Response.AddHeader("content-disposition", "attachment;  filename=ExcelDemo.xlsx");
        Response.BinaryWrite(ExcelHelper.GetByteArray(datatable));
        Response.End();
    }
    

    【讨论】:

    • 非常感谢您的回复。不幸的是,它不能解决问题。
    • @TimSchmelter - 这对错误定位的后续表单提交有何帮助?
    • @Igor:显然根本没有,因为 OP 评论说它不能解决问题。我以为它可以解决它。但是,无论如何这很重要。
    • 货物狂热 :)
    【解决方案3】:

    在按钮标记中添加OnServerClick="return false;",以避免回发

    【讨论】:

      猜你喜欢
      • 2010-10-23
      • 2018-10-13
      • 2015-06-06
      • 2018-06-04
      • 1970-01-01
      • 2011-12-11
      • 2011-09-28
      • 2011-12-27
      • 1970-01-01
      相关资源
      最近更新 更多