La característica de descarga no funciona dentro del panel de actualización en asp.net

Tengo un Control de usuario web que contiene un FormView . La vista de formulario muestra detalles del buscador de empleo. He proporcionado un botón para el enlace “Descargar curriculum vitae”, para que el administrador / Recursos Humanos pueda descargar el currículum. He colocado este control en una página aspx que contiene UpdatePanel. Todo funciona bien excepto Link de descarga.

He dado un comando en el botón Descargar enlace y una función está asociada con el comando para iniciar la descarga.

Debajo está el código que he implementado –

 //Command on 'Download' link button within FormView protected void lnkDownload_Command(object sender, CommandEventArgs e) { if (e.CommandName.Equals("Download")) { StartDownload(e.CommandArgument.ToString()); } } //My routine to download document //sFileInfo contains filepath$==$mimetype protected void StartDownload(string sFileInfo) { string[] d = sFileInfo.ToString().Split((new string[] { "$==$" }), StringSplitOptions.None); string filename = d[0]; string docType = d[1]; System.IO.FileInfo file = new System.IO.FileInfo(d[0]); if (file.Exists) { Response.Clear(); Response.AddHeader("Content-Disposition", "attachment; filename=" + d[0]); Response.AddHeader("Content-Length", file.Length.ToString()); Response.ContentType = d[1]; Response.WriteFile(file.FullName); Response.End(); } else { Server.Transfer("~/Mesgbox.aspx?cat=2"); } } 

El código funciona perfectamente si se elimina el panel de actualización, pero genera errores de script si se utiliza el panel de actualización.

Alguna sugerencia….?

Gracias por compartir tu tiempo.

Para iniciar una devolución de datos de página completa, agrega un desencadenador de devolución a su panel de actualización:

      ..... 

No puede devolver un archivo adjunto en una devolución de datos parcial de UpdatePanel, ya que ScriptManager utiliza los resultados para actualizar un DIV (no la respuesta completa). La solución más simple para lo que estás tratando de hacer sería hacer que tu botón de descarga sea un control de devolución de datos. Eso haría que ese botón inicie una devolución de datos completa. Aquí está el código a continuación para incluir en su Page_Load

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

Todavía puede activar el documento de descarga desde dentro de un Panel de actualización.

Tengo un panel de actualización y dentro tengo 3 repetidores nesteds. En el repetidor más interno, construyo una serie de enlaces de descarga usando LinkButtons, cada uno contiene un comando para recuperar el documento a través del servicio web y enviarlo.

Cada repetidor tiene un método OnItemDataBound. En el último repetidor tengo lo siguiente

  protected void LinkDocRepeaterOnItemDataBound(object sender, RepeaterItemEventArgs e) { if(!(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)) { return; } LinkButton linkButton = (LinkButton)e.Item.FindControlRecursive("LinkId"); var scriptManager = ScriptManager.GetCurrent(this.Page); if (scriptManager != null) { scriptManager.RegisterPostBackControl(linkButton); } } 

Cada botón Link ahora descarga un documento.

Mi situación:

Tenía un archivo Excel de larga ejecución cargado desde datos sql y quería que el panel de progreso de la actualización mostrara el gif spinner mientras el archivo se creaba y luego descargaba el archivo desde el panel de actualización. Fue más complicado de lo que pensé.

Este enlace salió muy alto en las búsquedas y, después de tratar de evitarlo, resultó que un iframe me era útil.

iframe async descargar

Esto es lo que terminó funcionando … (este código exacto no ha sido probado)

MyPage.aspx … (dentro del panel de actualización, sin activadores)

   

MyPage.aspx.cs

  protected void btnExcelExport_Click(object sender, EventArgs e) { //long running process here, taking advantage of the update progress panel var bytes = GetExcelFile(); //generate a key to pass to the download page to access the file bytes var cacheKey = Guid.NewGuid().ToString("N");//N means no hyphens //placing the result in cache for a few seconds so the download page can grab it Context.Cache.Insert(key: cacheKey, value: bytes, dependencies: null, absoluteExpiration: DateTime.Now.AddSeconds(30), slidingExpiration: System.Web.Caching.Cache.NoSlidingExpiration); ifmExcel.Attributes.Add("src", String.Format("MyDownloadPage.aspx?cacheKey={0}", cacheKey)); } 

MyDownloadPage.aspx.cs …

  protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { var bytes = Context.Cache.Get(Request.QueryString.Get("cacheKey")) as byte[]; Response.Clear(); Response.AddHeader( "content-disposition", string.Format("attachment; filename={0}.xlsx", "Invoice")); Response.ContentType = "application/xlsx"; Response.BinaryWrite(bytes); Response.End(); } } 

Parece que funciona como se esperaba, como lo haría cualquier otra publicación asincrónica.

No puede usar el objeto Response en el panel de actualización.

‘runat = “servidor” OnClick = “DownloadFile”>’ runat = “servidor” OnClick = “DeleteFile” /> < % ----%>

protected void UploadFile (remitente del objeto, EventArgs e) {if (FileUpload1.HasFile) {cadena FileName = Path.GetFileName (FileUpload1.PostedFile.FileName); cadena de extensión = “.” + FileName.Split (‘.’) [1] .ToString (); cadena FileName_Guid = Convert.ToString (Guid.NewGuid ()) + extensión; FileUpload1.PostedFile.SaveAs (@ “C: \ Uploads \” + FileName_Guid); cadena Platform_Config_ID = PlatformConfigID.Value; DataTable dt = new DataTable (); dt = DAL.Upload_File (FileName_Guid, FileName, Platform_Config_ID);

  gv_Files.DataSource = dt; gv_Files.DataBind(); ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page); scriptManager.RegisterPostBackControl(gv_Files); } } protected void DownloadFile(object sender, EventArgs e) { try { LinkButton lnkDownload = (LinkButton)sender; GridViewRow row = (GridViewRow)lnkDownload.NamingContainer; LinkButton download = row.FindControl("lnkDownload") as LinkButton; ScriptManager.GetCurrent(this).RegisterPostBackControl(download); string FileName = (sender as LinkButton).CommandArgument.Split(';')[0].ToString(); string OriginalFileName = (sender as LinkButton).CommandArgument.Split(';')[1].ToString(); string FilePath = @"C:\Uploads\" + FileName.ToString(); FileInfo file = new FileInfo(FilePath); if (file.Exists) { Response.ContentType = ContentType; Response.AppendHeader("Content-Disposition", "attachment; filename=" + OriginalFileName); Response.Headers.Set("Cache-Control", "private, max-age=0"); Response.WriteFile(FilePath); Response.End(); } } catch (Exception ex) { // do nothing } } protected void DeleteFile(object sender, EventArgs e) { string FileName_Guid = (sender as LinkButton).CommandArgument.Split(';')[0].ToString(); string File_ID = (sender as LinkButton).CommandArgument.Split(';')[1].ToString(); string Filename = (sender as LinkButton).CommandArgument.Split(';')[2].ToString(); string Platform_Config_ID = (sender as LinkButton).CommandArgument.Split(';')[3].ToString(); string FilePath = @"C:\Uploads\" + FileName_Guid; File.Delete(FilePath); DataTable dt = new DataTable(); dt = DAL.Delete_File(File_ID, Filename, Platform_Config_ID); gv_Files.DataSource = dt; gv_Files.DataBind(); } 

Por favor, prueba los siguientes pasos:

  1.    
  2. (Código detrás) UploadFile()

     ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page); scriptManager.RegisterPostBackControl(gv_Files); 
  3. DownloadFile()

     DownloadFile() --> LinkButton download = row.FindControl("lnkDownload") as LinkButton; ScriptManager.GetCurrent(this).RegisterPostBackControl(download);