我有两个带有onclick
事件处理程序的按钮,用于处理页面上两个grid views
的信息。每个gv一个按钮。它们位于彼此之上,嵌套在html
表结构中。
这些按钮用于将grid
日期导出到Excel
文档中(请参阅下面的代码)
当按钮上的grid
正常工作时,顶部按钮和click
但底部按钮会抛出ThreadAbortException: Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.
我自然而然就是Google-d,但其中一些最重要的结果是处理Response.Redirect()
来电,而不是Response.End()
。 Forums.asp.net上的一个这样的帖子在同一个方法调用中有相同的错误,但解决方案是使用错误页面作为参数更改代码Response.Redirect()
- 再次与我的内容无关。
另一个search at Microsoft Suport page建议使用HttpContext.Current.ApplicationInstance.CompleteRequest()
替换Response.End()
的解决方案。我试过这个,错误消失了,Excel下载弹出窗口就消失了。
所以我不知道从哪里开始。奇怪的是,相同的代码(少gridview
id)适用于一个而另一个。这是您的审核代码,我已经标记了错误发生的位置。
我想也许我可以产生一个新线程 - 这会减轻这个问题吗?我从来没有做过multi-threaded
应用程序,但我正在接受挑战。
<table>
<tr>
<td align="left">
<asp:Button ID="btnExport" runat="server" OnClick="btnExport_Click"
Text="Export" Visible="false" />
</td>
</tr>
<tr>
<td>
<asp:Panel runat="server" ID="pnl1" Visible="false">
<asp:GridView ID="gvCountTotalsCat" runat="server"
AutoGenerateColumns="false"
CellPadding="3" PageSize="25" BackColor="White" BorderColor="MidnightBlue"
BorderStyle="Groove" BorderWidth="1px" CssClass="TextCompact"
GridLines="Vertical"
OnRowDataBound="gridView_OnRowDataBound"
EmptyDataText="Your request has returned zero records">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<asp:Label runat="server" ID="lblHeader" Text="Cat" />
</HeaderTemplate>
<ItemTemplate>
<asp:Literal ID="litWuc" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Cat Entries" HeaderText="Cat Entries" />
<asp:TemplateField>
<HeaderTemplate>
<asp:Label runat="server" ID="lblHeader" />
</HeaderTemplate>
<ItemTemplate>
<asp:Literal ID="litSum" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</asp:Panel>
</td>
</tr>
<tr>
<td align="left">
<asp:Button ID="btnExport1" runat="server" OnClick="btnExport_Click1"
Text="Export" Visible="false" />
</td>
</tr>
<tr>
<td>
<asp:Panel runat="server" ID="pnl2" Visible="false">
<asp:GridView ID="gvCountTotalsCat1" runat="server"
AutoGenerateColumns="false"
AllowPaging="false" CellPadding="3" PageSize="25" BackColor="White"
BorderColor="MidnightBlue" BorderStyle="Groove" BorderWidth="1px"
CssClass="TextCompact" GridLines="Vertical"
OnRowDataBound="gridView_OnRowDataBound"
EmptyDataText="Your request has returned zero records">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<asp:Label runat="server" ID="lblHeaderWuc" Text="Wuc" />
</HeaderTemplate>
<ItemTemplate>
<asp:Literal ID="litWuc" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Wuc Entries" HeaderText="Wuc Entries" />
<asp:TemplateField>
<HeaderTemplate>
<asp:Label runat="server" ID="lblHeader" />
</HeaderTemplate>
<ItemTemplate>
<asp:Literal ID="litSum" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</asp:Panel>
</td>
</tr>
</table>
public void btnExport_Click(object sender, System.EventArgs e)
{
string attachment = string.Empty;
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
// Create a form to contain the grid
HtmlForm frm = new HtmlForm();
frm.Attributes["runat"] = "server";
attachment = "attachment; filename=gvCountTotalsCat_" + _selectedSite + ".xls";
gvCountTotalsCat.Parent.Controls.Add(frm);
frm.Controls.Add(gvCountTotalsCat);
Response.ClearContent();
Response.AddHeader("content-disposition", attachment);
Response.ContentType = "application/ms-excel";
frm.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();
}
public void btnExport_Click1(object sender, System.EventArgs e)
{
string attachment = string.Empty;
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
Response.Clear();
Response.ClearHeaders();
// Create a form to contain the grid
HtmlForm frm = new HtmlForm();
frm.Attributes["runat"] = "server";
attachment = "attachment; filename=gvCountTotalsCat1_" + _selectedSite + ".xls";
gvCountTotalsCat1.Parent.Controls.Add(frm);
frm.Controls.Add(gvCountTotalsCat1);
Response.ClearContent();
Response.AddHeader("content-disposition", attachment);
Response.ContentType = "application/ms-excel";
frm.RenderControl(htw);
Response.Write(sw.ToString());
try
{
>> Error thrown here >> Response.End();
}
catch (System.Threading.ThreadAbortException lException)
{
lException;
}
}
答案 0 :(得分:8)
我发现我在一个Update Panel
中同时拥有网格和按钮,并且只有顶部按钮设置为PostBackTrigger
。在我添加第二个<asp:PostBackTrigger ControlID="btnExport1" />
并解决问题之后。
答案 1 :(得分:4)
有一种方便的方法来处理“无法评估表达式,因为代码已经过优化,或者本机框架位于调用堆栈之上。”的问题。您需要在“输出”窗口中进行书写。
使用System.Diagnostics添加;
为错误的行添加Try / Catch
在Catch中添加这些行
try
{ ..}
catch(Exception ex)
{
Debug.WriteLine(ex.Message);
Debug.WriteLine(ex.StackTrace);
Debug.WriteLine(ex.InnerException.ToString());
}
只需调试并检查输出窗口
希望它有所帮助。
答案 2 :(得分:0)
可以使用ASPxGridViewExporter
解决,而无法获得ThreadAbortException
。
请尝试以下代码段:
try
{
using (MemoryStream stream = new MemoryStream())
{
// Write the content of the xlsx to the stream
gridViewExporter.WriteXlsx(stream, new XlsxExportOptions(TextExportMode.Text, false, false));
if (Response == null)
{
return;
}
// Write the byte content to the output
Response.Clear();
Response.AppendHeader("Content-Disposition", StringMngr.SafeFormat("attachment; filename=\"{0}.xlsx\"", "xlsxFileName"));
Response.ContentType = "Text/xlsx";
Response.ContentEncoding = System.Text.Encoding.Unicode;
if (stream.Length > 0)
{
Response.BinaryWrite(stream.ToArray());
}
Response.Flush();
Response.SuppressContent = true;
}
}
catch (Exception ex)
{
log.Error("An error occured while downloading in xlsx format.", ex);
}
下载excel文件时没有收到ThreadAbortException
消息:
无法评估表达式,因为代码已优化或本机框位于调用堆栈之上。
并且在打开excel文件时没有收到以下错误消息:
Excel在myFilename.xlsx中找到了不可读的内容。你想恢复这个工作簿的内容吗?如果您信任本书的来源,请单击“是”。
希望它有所帮助! :)