wake-up-neo.com

Die Download-Funktion funktioniert nicht im Update-Bereich von asp.net

Ich habe ein Web User Control, das eine FormView enthält. Die Formularansicht zeigt Details zum Arbeitsuchenden. Ich habe einen Button für den "Download Resume" -Link bereitgestellt, damit admin/HR den Lebenslauf herunterladen kann. Ich habe dieses Steuerelement auf einer Aspx-Seite platziert, die das UpdatePanel enthält. Alles funktioniert gut, außer Download Link. 

Ich habe einen Befehl für den Download-Link-Button gegeben, und dem Befehl zum Starten des Downloads ist eine Funktion zugeordnet. 

Unten ist der Code, den ich implementiert habe -

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

Der Code funktioniert einwandfrei, wenn das Aktualisierungsfenster entfernt wird, erzeugt jedoch Skriptfehler, wenn das Aktualisierungsfenster verwendet wird. 

Irgendwelche Vorschläge....?

Vielen Dank für Ihre Zeit.

24
IrfanRaza

Um ein vollständiges Seiten-Postback zu initiieren, fügen Sie Ihrem Aktualisierungsfenster einen Postback-Auslöser hinzu:

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

Sie können einen Anhang nicht in einem teilweisen UpdatePanel-Postback zurückgeben, da der ScriptManager die Ergebnisse dazu verwendet, ein DIV zu aktualisieren (nicht die gesamte Antwort). Die einfachste Lösung für das, was Sie versuchen, besteht darin, den Download-Button als Postback-Steuerelement zu verwenden. Dies würde dazu führen, dass diese Schaltfläche ein vollständiges Postback auslöst. Hier ist der Code, der in Ihrem PageLoad enthalten ist

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

Sie können das Herunterladen von Dokumenten weiterhin aus einem Update-Bereich auslösen.

Ich habe ein Update-Panel und innen habe ich 3 verschachtelte Repeater. Im innersten Repeater baue ich mit LinkButtons eine Reihe von Download-Links, von denen jeder einen Befehl zum Abrufen des Dokuments über den Webservice und zum Versenden dieses Dokuments enthält.

Jeder Repeater verfügt über eine OnItemDataBound-Methode. Im letzten Repeater habe ich folgendes 

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

Jeder Linkbutton lädt jetzt ein Dokument herunter.

5
carlosJ

Meine Situation:

Ich hatte eine lange laufende Excel-Datei, die aus SQL-Daten geladen wurde, und ich wollte, dass beim Aktualisierungsfortschritt das Spinner-Gif angezeigt wird, während die Datei erstellt wurde, und die Datei dann im Aktualisierungsfenster heruntergeladen wird. Es war schwieriger als ich dachte.

Dieser Link wurde bei Suchanfragen hoch angezeigt und nachdem ich versucht hatte, ihn zu vermeiden, stellte sich heraus, dass ein Iframe für mich nützlich war.

iframe async herunterladen

Hier ist, was am Ende funktionierte .. (dieser genaue Code wurde nicht getestet)

MyPage.aspx ... (innerhalb des Update-Panels, keine Auslöser)

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

Es scheint wie erwartet zu funktionieren wie jeder andere asynchrone Post zurück.

3
TheDev6

Bitte versuchen Sie die folgenden Schritte:

  1. <asp:UpdatePanel ID="UpdatePanel5" runat="server" l**UpdateMode="Conditional"**>
    <asp:GridView ID="gv_Files" runat="server" AllowPaging="True" PageSize="7" OnPageIndexChanging="gv_Files_PageIndexChanging" AutoGenerateColumns="false" EmptyDataText="No files uploaded" GridLines="None">
    
  2. (Code Behind) 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);
    

Sie können das Antwortobjekt nicht im Aktualisierungsfenster verwenden.

0
Anuraj

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

protected void UploadFile (Objektsender, EventArgs e) { if (FileUpload1.HasFile) { Zeichenfolge Dateiname = Pfad.GetFileName (FileUpload1.PostedFile.FileName); string extension = "." + FileName.Split ('.') [1] .ToString (); string FileName_Guid = Convert.ToString (Guid.NewGuid ()) + Erweiterung; 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();
    }