ASP.NET: могу ли я принудительно загрузить сохраненный файл и обновить метку в том же обработчике событий?

У меня есть источник данных ListView в базе данных, отображающий список файлов для загрузки вместе с количеством загрузок для каждого. В ItemTemplate я использую метку для отображения текущего количества и LinkButton с его текстом, установленным на имя файла, и его командой, установленной на «выбрать», чтобы запустить событие Listviews SelectedIndexChanging. Все это работает нормально, и я могу вызвать диалоговое окно загрузки, но не могу обновить метку (которая указывает на новое количество загрузок). Я подозреваю, что, поскольку я использую Response для загрузки двоичных данных, он теряет всю информацию для обновления метки... Одна из моих мыслей - сохранить поток ответов перед загрузкой файла, затем восстановить его в исходное состояние и попробовать чтобы обновить метку ItemTemplates.

   protected void FileListView_SelectedIndexChanging( Object sender, ListViewSelectEventArgs e )
   {
        ListViewItem item = (ListViewItem)PresetUploadListView.Items[e.NewSelectedIndex];
        LinkButton lb = (LinkButton)item.FindControl( "PresetUploadTitle" );
        int fileID = Convert.ToInt32( lb.CommandArgument.ToString( ), 10 );

        byte[] fileData = GetFileDataFromDatabasePreset(fileID);
        try
        {
            Response.ClearContent();
            Response.AddHeader("Content-Disposition", "attachment; filename=" + lb.Text + ".zip");
            BinaryWriter bw = new BinaryWriter(Response.OutputStream);
            bw.Write(fileData);
            bw.Close();
            Response.ContentType = "application/zip";
            Response.Flush();
            //Response.Close();
            //Response.End();
        }
        catch (Exception ex)
        {
            String s = ex.Message + " " + ex.InnerException;
        }
        Label l = (Label)item.FindControl("PresetUploadDownloads");
        int downloadCount = IncandreturnDownloadCount(fileID);
        l.Text = downloadCount.ToString(); //+> not getting updated...

        e.Cancel = true;
   }     

person Gio    schedule 26.09.2011    source источник
comment
См. соответствующий stackoverflow .com/questions/4926409/   -  person Mormegil    schedule 27.09.2011


Ответы (1)


Ваш запрос не может дать два разных ответа. Он не может реагировать на изменение страницы и одновременно обслуживать файл.

Доступно несколько вариантов.

  1. Используйте window.open в JavaScript, чтобы открыть окно для обработчика файлов, который инициирует загрузку до того, как страница отправится обратно. Загрузка начнется в другом окне, потом вы обновите свой ярлык в посте обратно.

  2. Сначала обновите метку с помощью вызова AJAX, затем, в случае успеха вызова AJAX, отправьте ответ и загрузите файл.

person vcsjones    schedule 26.09.2011