【问题标题】:Error when displaying pdf: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed显示pdf时出错:Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed
【发布时间】:2013-10-14 06:47:20
【问题描述】:

我正在尝试从 SQL 中提取一个 pdf 文件并将其显示给用户。我不断收到以下错误: Sys.WebForms.PageRequestManagerParserErrorException: 无法解析从服务器收到的消息。

我的项目正在使用 asp.net 加载一个 gridview,其中包含指向包含 pdf 的数据库记录的链接按钮。

当用户单击链接按钮时,应该从 SQL 中提取 pdf 并使用 Response.BinaryWrite 显示。

这是我的 aspx 代码:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="ReturnedReports.aspx.cs" Inherits="PP.ApKPI.WEB.ReturnedReports" %>
<asp:Content ID="Content2" ContentPlaceHolderID="HeaderContent" runat="server">
    <h1>Reports</h1>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server">

    <asp:UpdatePanel ID="ReportsUpdatePanel" runat="server">
        <ContentTemplate>
            <asp:Panel ID="ReportsPanel" runat="server" Height="611px">
                <h2>
                    Reports
                </h2>
                <asp:Label ID="ReportsNotification" runat="server"></asp:Label>
                <br />
                <asp:Label ID="Label1" runat="server" Text="Pharmacy: "></asp:Label>
                <asp:DropDownList ID="PharmaciesDropDownList" runat="server" AutoPostBack="true"
                    OnSelectedIndexChanged="PharmaciesDropDownList_SelectedIndexChanged">
                </asp:DropDownList>
                <br />
                <br />
                <%--<asp:Button ID="NewReport" runat="server" Text="Add Data" OnClick="NewReport_Click" />--%>
                <asp:GridView ID="ListReportsGridView" runat="server" AllowPaging="true" AllowSorting="true"
                    GridLines="None" PageSize="10" CssClass="GridView" AutoGenerateColumns="false"
                    EmptyDataText="No rows for selection." OnRowCommand="ListReportsGridView_RowCommand"
                    OnPageIndexChanging="ListReportsGridView_PageIndexChanging"
                    OnRowDataBound="ListReportsGridView_RowDataBound" 
                    EnablePersistedSelection="True"
                    DataKeyNames="FinDataID">
                    <AlternatingRowStyle CssClass="GridViewAltRow" />
                    <HeaderStyle CssClass="GridViewHeader" />
                    <RowStyle CssClass="GridViewItem" />
                    <PagerStyle CssClass="GridViewPager" />
                    <Columns>
                        <asp:BoundField DataField="ID" HeaderText="ID" ControlStyle-CssClass="Hidden" ItemStyle-CssClass="Hidden"
                            HeaderStyle-CssClass="Hidden" FooterStyle-CssClass="Hidden" />
                        <asp:BoundField DataField="FinDataID" HeaderText="FinDataID" ControlStyle-CssClass="Hidden" ItemStyle-CssClass="Hidden"
                            HeaderStyle-CssClass="Hidden" FooterStyle-CssClass="Hidden" />
                        <asp:BoundField DataField="PeriodStart" HeaderText="Period Start" DataFormatString="{0:dd/MM/yyyy}" />
                        <asp:BoundField DataField="PeriodEnd" HeaderText="Period End" DataFormatString="{0:dd/MM/yyyy}" />
<%--                        <asp:ButtonField DataTextField="FileName" HeaderText="Report" CommandName="ViewRpt" />--%>
                        <asp:TemplateField><ItemTemplate><asp:LinkButton ID="LinkButtonViewRpt" Text='<%#Eval("FileName") %>' CommandName="ViewRpt" CommandArgument="<%# Container.DataItemIndex %>" runat="server"></asp:LinkButton></ItemTemplate></asp:TemplateField>    
                        <asp:TemplateField Visible="false"><ItemTemplate></ItemTemplate></asp:TemplateField>
                    </Columns>
                </asp:GridView>
                <br />
            </asp:Panel>

    <asp:Panel ID="UploadPanel" runat="server" >
        <h2>Upload Report for
            <asp:Label ID="UPharmacyName" runat="server"></asp:Label>
        </h2>

        <p>
            <table width="360px">
                <tr>
                    <td>Period Start:</td>
                    <td>Period End:</td>
                </tr>
                <tr>
                    <td><asp:Label ID="lblUPeriodStart" runat="server" Width="50px"></asp:Label></td>
                    <td><asp:Label ID="lblUPeriodEnd" runat="server" Width="50px"></asp:Label></td>
                </tr>
            </table>
        </p>
            Select File to Upload:
            <asp:UpdatePanel ID="UploadPanel2" runat="server">
                <ContentTemplate>
                    <%--<asp:FileUpload ID="UploadFile" runat="server" />--%>
                    <asp:FileUpload ID="UploadFile" runat="server" />
                    <p>
                        <asp:Button ID="btnUpload" runat="server" OnClick="btnUpload_Click" 
                            Text="Upload" />
                        <asp:Button ID="btnCancelUpload" runat="server" OnClick="btnCancelUpload_Click" 
                            Text="Cancel" />
                </ContentTemplate>
<%--                <Triggers>
                    <asp:PostBackTrigger ControlID="btnUpload" />
                </Triggers>--%>
            </asp:UpdatePanel>
    </asp:Panel>

        </ContentTemplate>
    </asp:UpdatePanel>
    <asp:Button ID="btnClickMe" runat="server" OnClick="btnClickMe_Click" Visible="false" />
    <p></p>
</asp:Content>

下面是部分代码:

private void ViewPdf()
{
    //Response.Clear();
    Response.Buffer = true;
    //Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", "attachment;filename=" + objFileData.FileName);
    Response.Charset = "";
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.BinaryWrite(objFileData.Data);
    Response.Flush();
    Response.End();
}

如您所见,我尝试了 UpdatePanel 之外的不可见按钮,并且尝试了 PostBackTriggers 无济于事。我无法让 PostBackTrigger 工作,因为 UpdatePanel 无法识别我的链接按钮...

任何帮助将不胜感激!让我知道是否需要更多代码和详细信息。提前致谢!

【问题讨论】:

    标签: c# asp.net pdf dopostback


    【解决方案1】:

    所以我能够解决这个问题(好吧,不是我和我一起工作的人)!

    移除外部 UpdatePanel (ReportsUpdatePanel) 解决了这个问题。我不完全理解它是如何解决的,但显然它与同步和乱序发送 http 标头有关。如果其他人想评论并澄清这一点,请这样做!

    谢谢。

    【讨论】:

      【解决方案2】:

      从 asp 中删除相关网格 () 的 asp:AsyncPostBackTrigger 并添加以下代码(根据您的代码),这只是示例

      1. 在页面加载期间添加以下代码

        ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page); scriptManager.RegisterPostBackControl(this.ListReportsGridView);

      2. 然后使用自动选择按钮 =true 。如果您不需要该按钮,您可以在您的网格行中将显示设置为无。

      【讨论】:

      • 请重新格式化您的答案,使其更清晰易读。使用代码块标签。
      猜你喜欢
      • 1970-01-01
      • 2021-12-17
      • 2020-10-15
      • 1970-01-01
      • 2018-08-29
      • 2023-01-18
      • 2020-08-05
      • 1970-01-01
      • 2020-12-18
      相关资源
      最近更新 更多