Подтвердить что ты не робот

Функция загрузки не работает в панели обновления в asp.net

У меня есть веб-пользовательский элемент управления, содержащий FormView. Образ формы показывает детали поиска работы. Я предоставил кнопку для ссылки "Загрузить резюме", чтобы администратор /HR мог загрузить резюме. Я разместил этот элемент управления на странице aspx, содержащей UpdatePanel. Все работает отлично, кроме Download Link.

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Каждый ретранслятор имеет метод 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);
            }
        }

Каждый Linkbutton теперь загружает документ.

Ответ 4

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

У меня был длинный файл excel, загруженный из данных sql, и я хотел обновить панель прогресса, чтобы отобразить spinner 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();
        }
    }

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

Ответ 5

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

Ответ 6

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

protected void UploadFile (отправитель объекта, EventArgs e)       {           if (FileUpload1.HasFile)           {               string FileName = Path.GetFileName(FileUpload1.PostedFile.FileName);               string extension = "." + 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();
    }

Ответ 7

Попробуйте выполнить следующие действия:

  •  

    <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">
    
  • (Код позади) UploadFile()

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

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