Загрузка не удалась один раз, затем работает правильно

Я работаю над пользовательским элементом управления ASP.Net. В моем управлении у меня есть элемент управления FileUpload, внутри MultiView, внутри AJAX UpdatePanel.

Я добавил кнопку отправки в триггеры обратной отправки на панели обновлений. (Это стандартное исправление для работы FileUpload в UpdatePanel).

При первой отправке FileUpload ничего не загружает (т. е. свойство FileBytes элемента управления имеет нулевую длину). Все остальное в форме отправляется правильно.

При второй и последующих отправках загрузка работает корректно.

Что может быть причиной этого и как это исправить?


Например:

<asp:UpdatePanel runat="server" ID="update_panel" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:MultiView runat="server" ID="mvMultiView" ActiveViewIndex="0">
            <asp:View runat="server" ID="viewOne">
                <!-- content -->
            </asp:View>
            <asp:View runat="server" ID="viewTwo">
                <!-- some other form elements -->
                <asp:FileUpload ID="file_upload" runat="server" />
                <asp:Button ID="save_button" runat="server" Text="Save" OnClick="save_Click" ValidationGroup="group" />
            </asp:View>
         </asp:MultiView>
    </ContentTemplate>
    <Triggers>
        <asp:PostBackTrigger ControlID="save_button" />
    </Triggers>
</ajax:UpdatePanel>

person Sophia    schedule 09.11.2009    source источник


Ответы (5)


Оказалось, что это вызвано тем, что элемент управления FileUpload отображается во время частичного обновления страницы. Для правильной отправки элемент управления FileUpload должен быть отрисован и отправлен с использованием полных обратных сообщений. Поскольку первая отправка формы вызвала полный ответ, загрузка начала работать, как предполагалось, во второй раз.

Решение. Добавьте обе кнопки, отображающие и отправляющие элемент управления загрузкой файлов, в триггеры обратной отправки панели обновлений.

eg:

   <Triggers>
      <asp:PostBackTrigger ControlID="btnShowUploadForm" />
      <asp:PostBackTrigger ControlID="btnUpload" />
   </Triggers>                            
person Sophia    schedule 13.11.2009
comment
Как добавить кнопку, встроенную в элемент управления FileUpload? - person Muhammedh; 07.05.2014

Элемент управления FileUpload является одним из элементов управления, не поддерживаемых UpdatePanel.

Однако есть несколько других библиотек для загрузки AJAX. У Telerik есть хорошая программа, которой я пользовался раньше, но она платная. Хотя есть несколько приличных бесплатных, но вам придется попробовать некоторые из них. У каждого есть свои преимущества и недостатки.

person Josh Close    schedule 10.11.2009
comment
Проблема не в этом — управление загрузкой файлов обычно корректно работает на панели обновлений, если кнопка, отправляющая загрузку, вызывает полную обратную передачу (т. е. находится в панелях обновлений и срабатывает как PostBackTrigger). Я использовал эту технику несколько раз раньше, однако в этом случае она не работает должным образом при первой отправке, но работает при последующих. - person Sophia; 11.11.2009

У меня есть код, почти идентичный вашему, который отлично работает, за исключением моего UpdateMode=Conditional:

  <asp:UpdatePanel ID="upUpload" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
    <asp:RadioButton ID="rbImage" GroupName="resourceupload" Checked="true" Text="image" runat="server" />
    <asp:RadioButton ID="rbPdf" GroupName="resourceupload" Text="pdf" runat="server" />
     <asp:FileUpload ID="FileUpload1" runat="server"  Width="175"/>
    <asp:Button ID="btnUpload" runat="server" CausesValidation="false"
    Text="Upload" OnClick="btnUpload_Click" />
    <asp:Label ID="lblMsg" Visible="false" runat="server" Text=""></asp:Label>

    </ContentTemplate> 
    <Triggers>
      <asp:PostBackTrigger ControlID="btnUpload" />
      </Triggers>                            
   </asp:UpdatePanel>
person rick schott    schedule 11.11.2009
comment
С UpdateMode=true и обновлениями, запускаемыми вручную, эта проблема все еще возникает — я думаю, что эта проблема вызвана чем-то другим. - person Sophia; 12.11.2009

Я попытался добавить строку ниже в событие загрузки страницы, и она работает в первый и последующие разы.

Page.Form.Enctype = «мультипарт/форма-данные»;

Явное указание тега формы в источнике не сработает.

person jojo    schedule 07.12.2009

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

person jojo    schedule 07.12.2009