none
Descargar archivo no funciona mediante ModalPopupExtender RRS feed

  • Pregunta

  • hola a todos, bueno tengo un problema con al momento de realizar una descarga. Tengo un GridView donde lleno todos los mensajes, cuando se selecciona un mensaje levanta un Panel a través de un ModalPopupExtender. Al dar clic sobre el LinkButton no se descarga el archivo. ¿Cuál es la razón?

    <asp:Panel runat="server" ID="pMensajeRecibidos" BackColor="#E0E0E0">
        <asp:UpdatePanel ID="upMensajeRecibidos" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <table>
                    <tr>
                        <td>
                            <asp:GridView ID="gvMensajeRecibido" runat="server" AutoGenerateColumns="false" 
                                          OnRowCommand="gvMensajeRecibido_OnRowCommand" DataKeyNames="Id">                                      
                                <Columns>
                                    <asp:ButtonField DataTextField="Id" HeaderText="Seleccione" SortExpression="Id" CommandName="Mensaje_Id" />
                                    <asp:BoundField DataField="Observacion" HeaderText="Mensaje" SortExpression="Consulta" ItemStyle-Width="480" />
                                    <asp:BoundField DataField="Fecha" HeaderText="Fecha" SortExpression="Fecha" ItemStyle-Width="100" />
                                </Columns>
                            </asp:GridView>
                        </td>
                    </tr>
                </table>
            </ContentTemplate>
        </asp:UpdatePanel>
    </asp:Panel>
    
    <asp:HiddenField ID="hfMensajeRecibidos" runat="server" />
    
    <ajax:ModalPopupExtender ID="mpeMensajeRecibidos" runat="server" PopupControlID="pDetalleMensaje" 
                             TargetControlID="hfMensajeRecibidos" BackgroundCssClass="backgroundColor" >
    </ajax:ModalPopupExtender>
    
    <asp:Panel runat="server" ID="pDetalleMensaje" GroupingText="Mensaje" BackColor="#f0f9fc" 
               Width="600px" HorizontalAlign="Justify">
         <asp:UpdatePanel ID="upDetalleMensaje" runat="server" >
            <ContentTemplate>
                <table>
                    <tr>
                        <td>
                            <asp:GridView ID="gvDescargar" runat="server" OnRowCommand="gvDescargar_OnRowCommand"
                                                           AutoGenerateColumns="false" Visible="false" 
                                                           BorderColor="#f0f9fc">
                                <Columns>
                                    <asp:TemplateField HeaderText="Descargar" ShowHeader="false">
                                        <ItemTemplate>
                                            <asp:LinkButton ID="lkbDescargar" runat="server" CausesValidation="false"
                                                            CommandArgument='<%# Eval("Descargar") %>' 
                                                            CommandName="Download" Text='<%# Eval("Descargar") %>'> 
                                            </asp:LinkButton>
                                        </ItemTemplate>
                                    </asp:TemplateField>
                                </Columns>
                            </asp:GridView>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <asp:Button ID="btnSalir" runat="server" Text="Salir" OnClick="btnSalir_OnClick"  />
                        </td>
                    </tr>
                </table>
            </ContentTemplate>
        </asp:UpdatePanel>
    </asp:Panel>
     

    CodeBehind

    protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                }
            }
    
    protected void gvDescargar_OnRowCommand(object sender, GridViewCommandEventArgs e)
            {
                Response.Clear();
                Response.ContentType = "application/octet-stream";
                Response.AppendHeader("Content-Disposition", "filename=" + e.CommandArgument);
                Response.TransmitFile(Server.MapPath("~/Archivos/") + e.CommandArgument);
                Response.End();
            }

    Template.Master

    <asp:UpdatePanel ID="AjaxPanel" runat="server">
           <ContentTemplate>
                <div>
                    <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
                    
                    </asp:ContentPlaceHolder>
                </div>
           </ContentTemplate>
    </asp:UpdatePanel>

    Espero me puedan decir donde está mi error.

    Saludo.!

    martes, 23 de agosto de 2016 14:15

Respuestas

  • hola

    no va a funcionar estando dentro de un UpdatePanel

    Recomendaria que la descarga la realices en una ventana popup, cuando seleccionas el link de descarga que invoques a una nueva ventana que en el Page_Load envie el archivo para su descarga

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 23 de agosto de 2016 16:05

Todas las respuestas

  • hola

    no va a funcionar estando dentro de un UpdatePanel

    Recomendaria que la descarga la realices en una ventana popup, cuando seleccionas el link de descarga que invoques a una nueva ventana que en el Page_Load envie el archivo para su descarga

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 23 de agosto de 2016 16:05
  • Gracias por tu respuesta.

    Te comento que hice tal como me indicaste.

    Hice este cambio 

    protected void gvDescargar_OnRowCommand(object sender, GridViewCommandEventArgs e)
            {
                Response.Redirect("Descargar.aspx?filename=" + e.CommandArgument);
            }


    Tengo una nueva ventana que se llama Descargar.aspx

    public partial class Descargar : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                string filename = Request.QueryString["filename"].ToString();
    
                Response.Clear();
    
                Response.AddHeader("content-disposition", string.Format("attachment;filename={0}", filename));
                Response.ContentType = "application/octet-stream";
    
                Response.WriteFile(Server.MapPath(Path.Combine("~/Archivos", filename)));
    
                Response.End();
            }
        }

    Me funciona excelente. Gracias por la ayuda.!


    • Editado Karimbo2 martes, 23 de agosto de 2016 17:36
    martes, 23 de agosto de 2016 17:35