代码之家  ›  专栏  ›  技术社区  ›  user71934

系统。WebForms。PageRequestManagerParserErrorException:无法分析从服务器收到的消息-Gridview中的链接按钮

  •  0
  • user71934  · 技术社区  · 7 年前

    我目前正在研究VS 2010。 我的内容页上有一个gridview。我正在尝试从服务器下载文件。

    单击gridview中每个记录的链接按钮,即可实现文件下载功能。 gridview位于更新面板中,脚本管理器位于母版页上。 此外,我还在页面上使用了引导。

    在gridview中单击链接按钮时,将显示以下错误

    JavaScript运行时错误:Sys。WebForms。PageRequestManagerParserErrorException: 无法分析从服务器收到的消息。

    我在互联网上搜索了解决方案,但找不到任何修复方法。 我遇到了一些链接,这些链接中的按钮位于网格之外,并且遇到了类似的问题。但是,没有发现它有帮助。

    我尝试过使用“PostBackTrigger”。但这并不能解决问题。 我已经参考了下面的链接,但它并没有提供上述问题的解决方案

    Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed

    我也参考了其他链接,但找不到解决问题的方法。 此外,删除更新面板也不是一个选项。

    我正在放置我的页面的相关设计和代码。

    设计-

    <div class="col-xs-12 form-group">
                    <div class="table-responsive">
                        <asp:UpdatePanel ID="updPnlErrorDownload" runat="server" UpdateMode="Conditional">
                        <%--<Triggers>
                            <asp:AsyncPostBackTrigger  ControlID="lnkLogFiles"/>
                        </Triggers>--%>
                            <ContentTemplate>
                                <asp:GridView ID="gvLogFilesDownload" runat="server"
                                    AutoGenerateColumns="false" AllowPaging="true" 
                                    EmptyDataText="No Data Found" Width="100%" 
                                    CssClass="table table-striped table-bordered table-hover" PageSize="10" 
                                    onpageindexchanged="gvLogFilesDownload_PageIndexChanged" 
                                    onrowcommand="gvLogFilesDownload_RowCommand" 
                                    onrowcreated="gvLogFilesDownload_RowCreated">
                                    <Columns>
                                        <asp:TemplateField HeaderText="Date">
                                            <ItemTemplate>
                                                <asp:Label ID="lblDate" runat="server" Text='<%#Eval("Date") %>' />
                                            </ItemTemplate>
                                        </asp:TemplateField>
                                        <asp:TemplateField HeaderText="Log Files">
                                            <ItemTemplate>
                                                <asp:LinkButton ID="lnkLogFiles" runat="server" Text='<%#Eval("Log Files") %>' Font-Underline="true" CommandName="Download" CommandArgument="<%#((GridViewRow)Container).RowIndex %>"  OnClick="lnkLogFiles_Click"/>
                                            </ItemTemplate>
                                        </asp:TemplateField>
                                    </Columns>
                                    <EmptyDataTemplate>
                                        No Record Available</EmptyDataTemplate>
                                </asp:GridView>
                            </ContentTemplate>
                            <Triggers>
                            <%--<asp:PostBackTrigger ControlID="lnkLogFiles" />--%>
                           <%-- <asp:PostBackTrigger ControlID="gvLogFilesDownload$lnkLogFiles" />--%>
                        </Triggers>
                        </asp:UpdatePanel>
                    </div>
                </div>
    

    代码-

    protected void lnkLogFiles_Click(object sender, EventArgs e)
    {
        LinkButton lnkBtnDownload = sender as LinkButton;
        string file = lnkBtnDownload.Text;
        //string sPath1 = Server.MapPath(file);
        string sPath = Server.MapPath("~/ErrorLog/" + file);
        //Response.ContentType = "APPLICATION/OCTET-STREAM";
        Response.ContentType = "APPLICATION/pdf";
        Response.AppendHeader("Content-Disposition", "attachment;filename=" + System.IO.Path.GetFileName(sPath));
        Response.TransmitFile(sPath);
        Response.End();
    }
    

    非常感谢您的任何建议。 提前谢谢。

    1 回复  |  直到 7 年前
        1
  •  0
  •   VDWWD    7 年前

    问题是这些控件位于模板中,因此您无法直接引用它们。使用RowDataBound事件并通过编程方式为按钮分配触发器。

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        //check if the row is a datarow and not the first row
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            //find the button with findcontrol
            LinkButton lb = e.Row.FindControl("lnkLogFiles") as LinkButton;
    
            //assign the button as a postback trigger
            ScriptManager.GetCurrent(Page).RegisterPostBackControl(lb);
        }
    }