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