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;"
添加到按钮标记,以避免回传
这是您页面上发生的情况:
单击 asp:LinkButton
。在其客户端点击它调用 __doPostBack
将隐藏的 __EVENTTARGET
输入值设置为 btnExportToExcel
。
表单已提交至服务器。浏览器正在等待新内容到达。
新内容是可下载的文件,所以浏览器页面不会被清除,保持提交时的状态。
单击带有 type="submit"
的任何按钮会导致带有 __EVENTTARGET
的表单提交仍然具有 btnExportToExcel
值。
服务器端页面将 POST
请求 Request.Form["__EVENTTARGET"]="btnExportToExcel"
解释为点击 btnExportToExcel
。
我的 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;"
添加到按钮标记,以避免回传
这是您页面上发生的情况:
-
单击
asp:LinkButton
。在其客户端点击它调用__doPostBack
将隐藏的__EVENTTARGET
输入值设置为btnExportToExcel
。表单已提交至服务器。浏览器正在等待新内容到达。
新内容是可下载的文件,所以浏览器页面不会被清除,保持提交时的状态。
单击带有
type="submit"
的任何按钮会导致带有__EVENTTARGET
的表单提交仍然具有btnExportToExcel
值。服务器端页面将
POST
请求Request.Form["__EVENTTARGET"]="btnExportToExcel"
解释为点击btnExportToExcel
。