Использование LinkButton внутри GridView и UpdatePanel приводит к ошибке 0x800a139e - PullRequest
0 голосов
/ 23 октября 2018

Я использую Gridview внутри UpdatePanel.В этом Gridview я использую LinkButton (у меня такая же проблема с imageButton) для CommandArgument и пытаюсь загрузить pdf-файл, когда пользователь нажимает.

Было довольно сложно запустить Button в этом UpdatePanel, но все, кажется, в порядке.Пользователь нажимает кнопку, и я получаю правильный идентификатор с CommandArgument.С этим идентификатором я пытаюсь Response файл pdf, но получаю сообщение об ошибке:

0x800a139e - Ошибка времени выполнения JavaScript: Sys.WebForms.PageRequestManagerParserErrorException: сообщение, полученное с сервера, не может быть проанализировано.

Файл 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();
    }

1 Ответ

0 голосов
/ 23 октября 2018

Проблема в том, что ваша Fehlermeldung кнопка ссылки содержится внутри TemplateField, поэтому вы не можете напрямую ссылаться на нее, как это делает нормальный LinkButton.

Вам нужно обработать RowDataBound событие GridView, чтобы найти кнопку ссылки по ее имени элемента управления и запустить там кнопку обратной передачи, используя RegisterPostBackControl() (GridViewName - ваш идентификатор вида сетки):

Разметка 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: сообщение, полученное с сервера, не может быть проанализировано

...