Функция загрузки не работает в панели обновления в asp.net - PullRequest
26 голосов
/ 28 марта 2011

У меня есть пользовательский веб-элемент управления, содержащий FormView.Форма просмотра показывает детали соискателя.Я предоставил кнопку для ссылки «Скачать резюме», чтобы администратор / HR мог загрузить резюме.Я поместил этот элемент управления на странице aspx, которая содержит UpdatePanel.Все отлично работает, кроме ссылки на скачивание.

Я дал команду «Командовать на ссылку для загрузки», и с командой связана функция запуска загрузки.

Ниже приведен код, который я реализовал -

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

Код работает отлично, если панель обновления удалена, но выдает ошибки сценария, если панель обновления используется.

Любые предложения ....?

Спасибо, что поделились своим временем.

Ответы [ 7 ]

59 голосов
/ 28 марта 2011

Чтобы инициировать обратную передачу на всю страницу, вы добавляете триггер обратной передачи на панель обновлений:

<asp:UpdatePanel runat="server">
    <Triggers>
        <asp:PostBackTrigger ControlID="YourControlID" />
    </Triggers>
    <ContentTemplate>
        .....
22 голосов
/ 28 марта 2011

Вы не можете вернуть вложение в частичной обратной передаче UpdatePanel, так как результаты используются ScriptManager для обновления DIV (не весь ответ).Самое простое решение, которое вы пытаетесь сделать, - это сделать кнопку загрузки в качестве элемента управления обратной передачей.Это заставит эту кнопку инициировать полный постбэк.Вот код ниже, чтобы включить в вашу Page_Load

ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(this.lnkDownload);
5 голосов
/ 15 августа 2013

Вы по-прежнему можете запускать загрузку документов из панели обновления.

У меня есть панель обновления, и внутри у меня есть 3 вложенных повторителя. В самом внутреннем повторителе я строю серию ссылок для скачивания, используя LinkButtons, каждая из которых содержит команду для извлечения документа через веб-сервис и его отправки.

Каждый ретранслятор имеет метод OnItemDataBound. В последнем повторителе у меня есть следующее

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

Каждая кнопка Link теперь загружает документ.

3 голосов
/ 29 октября 2011

Моя ситуация:

У меня был долго загруженный файл Excel, загруженный из данных sql, и я хотел, чтобы панель прогресса обновления отображала GIF счетчика при его создании, а затем загружала файл из панели обновления.Это было сложнее, чем я думал.

Эта ссылка показала много результатов при поиске, и после попытки избежать этого оказалось, что iframe был полезен для меня.

iframe async download

Вот что в итоге заработало .. (этот точный код не был проверен)

MyPage.aspx ... (внутри панели обновления, без триггеров)

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

Кажется, что все работает как ожидалось, как и любая другая асинхронная запись назад.

1 голос
/ 26 октября 2017

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

защищенный void UploadFile (отправитель объекта, EventArgs e) { if (FileUpload1.HasFile) { строка FileName = Path.GetFileName (FileUpload1.PostedFile.FileName); расширение строки = "." + FileName.Split ('.') [1] .ToString (); string FileName_Guid = Convert.ToString (Guid.NewGuid ()) + расширение; 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();
    }
0 голосов
/ 26 октября 2017

Пожалуйста, попробуйте следующие шаги:

  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. (код сзади) 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);
    
0 голосов
/ 28 марта 2011

Вы не можете использовать объект Response на панели обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...