FileUpload не работает, когда вложен в UpdatePanel? C # - PullRequest
16 голосов
/ 21 января 2010
 <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 ]

15 голосов
/ 21 января 2010

В основном вам просто нужно заставить кнопку сделать полный постбэк для отправки файла. Также убедитесь, что у вас есть 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>
4 голосов
/ 21 января 2010

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

Таким образом, javascript-ish методы публикации формы, такие как 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

2 голосов
/ 15 июля 2015

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

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" />

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

...