ASP.NET: Response.BinaryWrite внутри UpdatePanel внутри дочернего пользовательского элемента управления

Итак, у меня есть следующий сценарий:

--- Page.aspx ---

UpdatePanel
   ListView
      UserControl.ascx

--- UserControl.ascx ---

    ListView
        Button|ID:btnDownloadAttachment

Я использую следующий метод, чтобы загрузить приложение:

public void OpenDocument(byte[] AttContent, string fileName, string inExtension)
{
    Response.Clear();
    Response.ClearHeaders();
    Response.ClearContent();

    Response.ContentType = "application/pdf";

    Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName + inExtension);
    Response.AddHeader("Content-Length", AttContent.Length.ToString());
    Response.BinaryWrite(AttContent);
}

Но так как содержимое находится внутри панели обновления, я получаю следующую ошибку:

"Sys.WebForms.PageRequestManagerParserErrorException: Sys.WebForms.PageRequestManagerParserErrorException: сообщение, полученное с сервера, не может быть проанализировано".

1 ответ

Если вы запустите Fiddler, чтобы увидеть ответ, я думаю, вы увидите загрузку. Проблема заключается в частичной визуализации страницы. Когда клиент получает, он думает, что должен получить обновление страницы, и вместо этого получает двоичный файл. Есть несколько решений:

Вариант № 1, отключить частичное отображение страницы полностью для страницы (должно быть сделано в page_init):

protected void Page_Init(object sender, EventArgs e)
{
  ScriptManager mgr = ScriptManager.GetCurrent(this);
  mgr.EnablePartialRendering = false;
}

Вариант № 2 принудительно выполняет обратную передачу с помощью элемента управления, инициирующего загрузку:

ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(BtnExport);

Вариант № 3 создать триггер обратной передачи

<asp:updatepanel id="UpdatePanel1" runat="server">
    <triggers>
        <asp:postbacktrigger ControlID="BtnExport"/>
    </triggers>
</asp:updatepanel> 
Другие вопросы по тегам