我有一个从 GridView 类派生的控件。BottomPagerRow 始终可见。覆盖 InitializePager,我在 UpdatePanel 中添加了一个 UpdatePanel 和一个 LinkButton(单击事件指向函数以转换数据)。
var download = new LinkButton { Text = "Open in Excel", CssClass = "fakeButton", ID = "DownloadToExcel" };
download.Click += DownloadExcelFile;
var up = new UpdatePanel() { ID = "ExcelUpdatePanel" };
var trigger = new PostBackTrigger { ControlID = download.ID };
up.Triggers.Add(trigger);
up.ContentTemplateContainer.Controls.Add(download);
row.Cells[0].Controls.Add(up);
当我使用控件单击页面中的 LinkButton 时,我在 Web 浏览器中看到以下客户端异常,
未捕获的 Sys.WebForms.PageRequestManagerParserErrorException:Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器接收到的消息。
据我了解,我认为这是因为我在 DownloadExcelFile() 中使用了 Response.Write。但是,我认为根据此链接添加 PostBackTrigger 可以避免这种情况。我还将 InitializePager 事件中的 PostBackTrigger 生成替换为
ScriptManager.GetCurrent(Page).RegisterPostBackControl(download);
但是,结果保持不变,有时它有效,有时我看到异常。该异常在类似于以下内容的页面中可见:
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master"
AutoEventWireup="true" CodeBehind="somePage.aspx.cs" Inherits="somePage" %>
<asp:Content ID="SomeContent" ContentPlaceHolderID="MainContent" runat="server">
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
Some other junk...
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel runat="server" ID="SomePanel" UpdateMode="Conditional">
<ContentTemplate>
<asp:CustomGridView ID="SomeCustomGridView" runat="server" AutoGenerateColumns="False"
DataSourceID="SomeSqlDataSource" AllowPaging="True" AllowSorting="True">
<Columns>
<asp:BoundField DataField="SomeField" />
</Columns>
</asp:CustomGridView>
<asp:SqlDataSource ID="SomeSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:SomeConnectionString %>"
SelectCommand="<%$ Resources: SomeResource, Query %>">
<SelectParameters>
<asp:QueryStringParameter Name="SomeId" QueryStringField="SomeId" />
</SelectParameters>
</asp:SqlDataSource>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>
此子页面使用的母版页包括 ToolkitScriptManager。我正在使用 .NET Framework 4。如果有人对如何避免此异常有意见,我将不胜感激。不确定我是在控件生命周期的错误部分添加触发器,还是完全错过了链接文章的要点。谢谢。