在 GridView 和 UpdatePanel 中使用 LinkBut​​ton 出现 0x800a139e 错误

Using LinkButton inside GridView and UpdatePanel getting 0x800a139e error

我在 UpdatePanel 中使用 Gridview。在那个 Gridview 中,我为 CommandArgument 使用 LinkButton(我对 imageButton 有同样的问题),并尝试在用户单击时下载 pdf 文件。

UpdatePanel 中获取按钮 运行 很棘手,但一切似乎都很好。用户单击按钮,我得到了带有 CommandArgument 的正确 ID。使用此 ID,我尝试 Response pdf 文件但出现错误:

0x800a139e - JavaScript runtime error: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed.

pdf 文件在服务器上,UpdatePanel 外有一个按钮,我得到了正确的 pdf 文件。那么我必须更改什么才能将其放入 UpdatePanel 运行?谢谢

网格视图:

 <asp:TemplateField HeaderText="" ItemStyle-HorizontalAlign="Center">
                <ItemTemplate>
                    <asp:LinkButton ID="Fehlermeldung" runat="server" CommandArgument='<%#Eval("ID")%>' OnClick="Fehlermeldung_Click1">
                     <asp:Image ID="Fehler" ImageUrl="~/images/fehlermeldung.png" ToolTip="Fehlermeldung anzeigen" runat="server" />
                    </asp:LinkButton>
                </ItemTemplate>
                <ItemStyle HorizontalAlign="Center" />
            </asp:TemplateField>

后面的代码:

protected void Fehlermeldung_Click1(object sender, EventArgs e)
    {
        string id = ((LinkButton)sender).CommandArgument;

            Response.ClearHeaders();
            Response.ContentType = "application/pdf";
            Response.Clear();
            Response.AppendHeader("Content-Disposition", "attachment;Filename=Fehlermeldung_" + id + ".pdf");
            Response.TransmitFile(Page.MapPath(@"App_Data\Fehlermeldung_" + id + ".pdf"));
            Response.End();
    }

问题是您的 Fehlermeldung link 按钮包含在 TemplateField 中,因此您不能像正常的 LinkButton 那样直接引用它。

您应该处理 GridViewRowDataBound 事件以通过其控件名称找到 link 按钮,并使用 RegisterPostBackControl()GridViewName 是您的网格视图 ID):

ASPX 标记

<asp:GridView ID="GridViewName" OnRowDataBound="GridViewName_RowDataBound" runat="server" ...>
    <%-- gridview contents --%>
</asp:GridView>

代码隐藏

protected void GridViewName_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // find link button first
        LinkButton btn = e.Row.FindControl("Fehlermeldung") as LinkButton;

        // use postback trigger assignment
        ScriptManager.GetCurrent(Page).RegisterPostBackControl(btn);
    }
}

参考:

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