无法计算表达式,因为代码已优化或本机帧位于调用堆栈之上

时间:2013-03-14 19:03:15

标签: c# asp.net webforms

我有两个带有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;
    }
}

3 个答案:

答案 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中找到了不可读的内容。你想恢复这个工作簿的内容吗?如果您信任本书的来源,请单击“是”。

希望它有所帮助! :)