FileUpload не работает, когда вложен в UpdatePanel? C#

 <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                <ContentTemplate>
                        <asp:FileUpload onchange="clickTheButton();" ID="FileUpload1" runat="server" />
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="Button1" />
                </Triggers>
</asp:UpdatePanel>

Кнопка 1 находится за пределами панели обновления, и JavaScript, который запускается, когда пользователь добавляет файл в поле загрузки, выглядит так:

function clickTheButton() {
            document.getElementById('<%= Button1.ClientID %>').click();
        }

Проблема проста. FileUpload1.HasFile == false. Я не знаю, почему это так, но когда я помещаю его в панель обновления, он перестает работать.

Я видел некоторые другие темы по этому вопросу. Но никто из них не отвечает, почему это происходит, они просто указывают на то, что вы можете скачать.

РЕДАКТИРОВАТЬ: действительно моя главная причина желания сделать это, чтобы я мог получить тег..Uploading File.. всплывающее окно, пока клиент загружает на сервер и после его завершения, отображать его в списке данных. Я просто не могу заставить UpdateProgress работать.

3 ответа

Решение

По сути, вам просто нужно, чтобы ваша кнопка делала полный постбэк для отправки файла. Также убедитесь, что у вас есть this.Form.Enctype = "multipart/form-data"; установить в своем коде, или вы можете поместить на этой странице. AsyncPostbacks не работают с файлами по соображениям безопасности, как уже упоминалось, без хаков. (Я никогда не смог заставить его работать).

 <asp:UpdatePanel ID="UpdatePanel1" runat="server">
      <ContentTemplate>
           <asp:FileUpload onchange="clickTheButton();" ID="FileUpload1" runat="server" />
      </ContentTemplate>
      <Triggers>
         <asp:PostBackTrigger ControlID="Button1" />
      </Triggers>
 </asp:UpdatePanel>

Загрузка файла не будет работать с частичной обратной записью. Так что просто добавьте эту строку при загрузке вашей страницы

ScriptManager.GetCurrent(this).RegisterPostBackControl(this.YourControlID);

Или использовать PostBackTrigger,

<Triggers>
            <asp:PostBackTrigger ControlID="YourControlID" />
</Triggers>

Или Вам нужен специальный элемент управления AsyncFileUpload, как определено в AjaxControl Toolkit.

<ajaxToolkit:AsyncFileUpload OnClientUploadError="uploadError"
     OnClientUploadComplete="uploadComplete" runat="server"
     ID="AsyncFileUpload1" Width="400px" UploaderStyle="Modern"
     UploadingBackColor="#CCFFFF" ThrobberID="myThrobber" />

Вы можете проверить здесь.

В целях безопасности браузеры не позволяют публиковать файлы через JavaScript. Представьте себе, если бы я мог написать немного JavaScript для асинхронной отправки содержимого вашей папки "Мои документы" на мой сервер.

Таким образом, javascript-методы вывода формы, такие как XMLHttpRequest, используемый UpdatePanel, не будут работать.

Этот пост описывает достойную работу, если вы используете 3.5 SP1. http://geekswithblogs.net/ranganh/archive/2009/10/01/fileupload-in-updatepanel-asp.net-like-gmail.aspx

И в этом посте описывается пара способов, если вы не хотите использовать AjaxControlToolkit. http://geekswithblogs.net/ranganh/archive/2008/04/01/file-upload-in-updatepanel-asp.net-ajax.aspx

Другие вопросы по тегам