web-dev-qa-db-fra.com

La fonctionnalité de téléchargement ne fonctionne pas dans le panneau de la page asp.net

J'ai un contrôle d'utilisateur Web contenant un FormView. Le formulaire affiche les détails du demandeur d'emploi. J'ai fourni un bouton pour le lien "Télécharger le CV", afin que l'administrateur/les ressources humaines puissent télécharger le CV. J'ai placé ce contrôle dans une page aspx contenant UpdatePanel. Tout fonctionne bien sauf lien de téléchargement. 

J'ai donné un bouton Commande sur le lien de téléchargement et une fonction est associée à la commande pour démarrer le téléchargement. 

Ci-dessous le code que j'ai implémenté -

//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");
    }
}

Le code fonctionne parfaitement si le panneau de mise à jour est supprimé, mais génère des erreurs de script si le panneau de mise à jour est utilisé. 

Aucune suggestion....?

Merci de partager votre temps.

24
IrfanRaza

Pour initier une publication de page complète, vous ajoutez un déclencheur de publication à votre panneau de mise à jour:

<asp:UpdatePanel runat="server">
    <Triggers>
        <asp:PostBackTrigger ControlID="YourControlID" />
    </Triggers>
    <ContentTemplate>
        .....
57
Mitul

Vous ne pouvez pas renvoyer de pièce jointe dans une publication partielle de UpdatePanel, car les résultats sont utilisés par le ScriptManager pour mettre à jour une DIV (et non la réponse complète). La solution la plus simple pour ce que vous essayez de faire serait de faire de votre bouton de téléchargement un contrôle de publication. Cela provoquerait ce bouton pour lancer une publication complète. Voici le code ci-dessous à inclure dans votre Page_Load

ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(this.lnkDownload);
20
Ken Melton

Vous pouvez toujours déclencher le téléchargement de la documentation depuis un panneau de mise à jour.

J'ai un panneau de mise à jour et à l'intérieur, j'ai 3 répéteurs imbriqués. Dans le répéteur le plus interne, je construis une série de liens de téléchargement à l'aide de LinkButtons, chacun contenant une commande permettant d'extraire le document via WebService et de le distribuer.

Chaque répéteur a une méthode OnItemDataBound. Dans le dernier répéteur j'ai le suivant 

        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);
            }
        }

Chaque bouton de liaison télécharge maintenant un document.

5
carlosJ

Ma situation:

J'avais un long fichier Excel chargé à partir de données SQL et je voulais que le panneau de progression de la mise à jour affiche le gif spinner lors de la création du fichier, puis télécharge le fichier depuis le panneau de mise à jour. C'était plus compliqué que je pensais.

Ce lien est apparu très cher lors des recherches et après avoir essayé de l'éviter, il s'est avéré qu'un iframe m'était utile.

Téléchargement async d'iframe

Voici ce qui a fini par fonctionner .. (ce code exact n'a pas été testé)

MyPage.aspx ... (dans le panneau de mise à jour, aucun déclencheur)

<asp:Button runat="server" ID="btnExcelExport" Text="Export to Excel" OnClick="btnExcelExport_Click" />

<iframe runat="server" id="ifmExcel" width="0" height="0" marginheight="0" marginwidth="0"
                    frameborder="0" />

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();
        }
    }

Il semble fonctionner comme prévu comme le ferait n'importe quel autre post asynchrone.

3
TheDev6

Vous ne pouvez pas utiliser l'objet Response dans le panneau de mise à jour.

0
Anuraj

'runat = "serveur" OnClick = "DownloadFile"> 'runat = "serveur" OnClick = "DeleteFile" /> <% ----%>

void protégé UploadFile (objet expéditeur, EventArgs e) { if (FileUpload1.HasFile) { string FileName = Path.GetFileName (FileUpload1.PostedFile.FileName); extension de chaîne = "." + NomFichier.Split ('.') [1] .ToString (); string FileName_Guid = Convert.ToString (Guid.NewGuid ()) + extension; FileUpload1.PostedFile.SaveAs (@ "C:\Uploads \" + FileName_Guid); string 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();
    }