Асинхронная загрузка файлов внутри панели обновлений и выпадающий список для запуска обратной передачи не работает - PullRequest
2 голосов
/ 19 декабря 2011
 <asp:AsyncFileUpload ID="AFU_Video" OnUploadedComplete="btnVidUpload_Click" 
             runat="server" UploaderStyle="Traditional" ThrobberID="aajaxLoader" />

У меня есть Ajax Async File Upload внутри update panel, который загружает файл асинхронно, когда файл выбран

это метод загрузки файла

protected void btnVidUpload_Click(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
    {
        lbl_VideoLinkName.Visible = true;
        if (AFU_Video.HasFile)
        {            
            //create the path to save the file to  
            string filename = AFU_Video.FileName;
            string Fullpath = Path.Combine(@"D:\Media", filename);
            AFU_Video.SaveAs(Fullpath);
            lbl_VideoLinkName.Text = "You uploaded " + AFU_Video.FileName;
            Hidd_VideoLoc.Value = filename;
        }

В методе, в котором я храню местоположение файла в Hidd_VideoLoc (hidden field), под загрузкой файла у меня есть выпадающий список, который отправляет сообщение обратно при изменении значения. Когда раскрывающееся значение изменяется, загрузка файла теряет файл, но файл загружается на сервер. Я хочу, чтобы имя файла обновляло базу данных при нажатии кнопки «Отправить», но значение «Скрытое» также теряет имя файла, и оно пустое. Но файл присутствует на сервере. Я пытался сохранить значение имени файла в скрытом поле в btnVidUpload_Click, но оно сохранило значение, но в SelectedIndexChanged скрытое поле теряет его значение. Как я могу сохранить значение в скрытом поле даже после поста назад (я не хочу использовать сессию)

      <asp:DropDownList ID="ddl_Res" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddl_SelectedIndexChanged">
 </ContentTemplate>
  <Triggers>
    <asp:AsyncPostBackTrigger ControlID="ddl_Res" EventName="SelectedIndexChanged" />         
  </Triggers>

Ответы [ 2 ]

0 голосов
/ 19 декабря 2011

У меня была такая же проблема пару недель назад, aspx был очень сложным, и мне пришлось поместить filepath в session.Я бы порекомендовал вам попробовать сделать это таким образом.Я также помню, что не мог найти другого решения в Google или здесь, в стеке.

0 голосов
/ 19 декабря 2011

AsyncFileUpload - это асинхронный элемент управления сам по себе.Это означает, что когда вы загружаете файл с помощью этого элемента управления, он загружается на сервер.

Затем, если вы нажмете кнопку «Сохранить», чтобы загрузить снова, он снова загрузит этот файл, если только элемент управления fileupload не попадет на сервер, тогдаочищает себя.

К сожалению, вы должны сохранить этот файл, когда он попадает на сервер в первый раз.Вы можете использовать сеанс или сохранить его в файловой системе с известным идентификатором, например, 1234.tmp, а затем захватить его, когда установлен элемент UpdatePanel.

Кроме того, чтобы убедиться, что вы очистили AsyncFileUpload, это то, что вы делаете,После завершения загрузки файла

 protected void AsyncFileUpload_OnUploadedComplete(object sender, 
                                     AjaxControlToolkit.AsyncFileUploadEventArgs e)
    {

        ((AsyncFileUpload)sender) // You have to save this somewhere, or the information in it


        ((AsyncFileUpload)sender).ClearAllFilesFromPersistedStore();
        ((AsyncFileUpload)sender).ClearFileFromPersistedStore();
        sender = null;
    }

Затем на странице используйте некоторый javascript как таковой при событии завершения загрузки элемента управления

function UploadComplete() {
        var btn = document.getElementById('MainContent_btnEnter');

        btn.value = "Enter";
        btn.disabled = false;
        var form1 = document.getElementById('form1');
        form1.target = "";

        document.getElementById('MainContent_upVideo').innerHTML = 'Uploaded Successfully';
        document.getElementById('MainContent_upVideo').value = '';
        document.getElementById('MainContent_upVideo_ClientState').value = '';
    }

Обратите внимание, что вам необходимо сбросить целевой объект формы.Также обратите внимание, что вам нужно очистить значение ClientState, и вы можете добавить какой-нибудь законченный текст на странице.MainContent - это просто ContentHolder, поэтому убедитесь, что вы получили правильное имя элемента управления для своей страницы.

...