ASP.NET。 HTML 按钮在导出 Excel 文件后导致回发

ASP.NET. HTML button causes a postback after exporting Excel file

我的 asp.net 网络表单中有 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 为 asp.net 按钮控件负责Excel 导出,即 btnExportToExcel 按钮的 OnClick 事件再次触发,我再次导出相同的 Excel 文件。

我在 OnClick 事件中的响应有问题吗?还是我错过了其他东西?

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

编辑。在 Igor 回复之后,问题与 Response 无关(即我认为 Response 可能丢失了一些东西)是否正确并且它可以被视为预期行为并且我需要小心我的按钮利用?

开头少了一个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();
}

OnServerClick="return false;" 添加到按钮标记,以避免回传

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

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

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

  3. 新内容是可下载的文件,所以浏览器页面不会被清除,保持提交时的状态。

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

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