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>