bjay tiamsic Ответов: 3

Fileupload с не работает внутренней панели обновления во вложенной таблицы ASP.NET с#


Привет.

У меня возникли проблемы с работой над управлением FileUpload внутри UpdatePanel.
На самом деле у меня есть 2 сценария

1. кнопка добавлена в AsyncPostBackTrigger, но она не может обнаружить HasFiles FileUpload.

2. Если кнопка добавлена в качестве PostBackTrigger в панели обновления, она вызывает полную страницу post back, которая закрывает мою вложенную сетку, когда она должна оставаться открытой. Вот мой код.


HTML / ASP.NET

Это поле шаблона находится внутри дочернего gridview GridView1 (у меня есть 2 вложенных gridviews)


<asp:TemplateField HeaderText="Payslip Document" ItemStyle-Width="15%">
<ItemTemplate>
      <asp:UpdatePanel ID="upPayslipUpload" runat="server" UpdateMode="Conditional">
      <Triggers>
          <asp:PostBackTrigger ControlID="btnUpload" /><%--This line causes full page post back--%>
          <%--<asp:AsyncPostBackTrigger EventName="Click" ControlID="btnUpload" />--%>      <%--This line cannot detect HasFile--%>
      </Triggers>
      <ContentTemplate>
        <asp:FileUpload ID="btnPayslipUpload" runat="server"  />
        <asp:Button id="btnUpload" runat="server" CssClass="fas fa-upload" OnClick="btnUpload_Click"></asp:Button>
        <p><asp:Label ID="lblPayslipUploadErr" runat="server" CssClass="error"></asp:Label></p>
                                                                                
     </ContentTemplate>
     </asp:UpdatePanel>
</ItemTemplate>
</asp:TemplateField>


Что я уже пробовал:

Вот мой код-зад

protected void btnUpload_Click(object sender, EventArgs e)
        {
            var btnUpload = (Button)sender;
            var gvRow = (GridViewRow)btnUpload.Parent.Parent.Parent.Parent;
            var btnPayslipUpload = (FileUpload)gvRow.FindControl("btnPayslipUpload");
            var lblPayslipUploadErr = (Label)gvRow.FindControl("lblPayslipUploadErr");
            var upPayslipUpload = (UpdatePanel)gvRow.FindControl("upPayslipUpload");
            lblPayslipUploadErr.Text = "";

            if (btnPayslipUpload.HasFile)
            {
                if(FileUploadValidateExt(btnPayslipUpload.FileName))
                {
                    if (FileUploadValidateFileSize(btnPayslipUpload.PostedFile.ContentLength))
                    {

                    }
                    else
                    {
                        lblPayslipUploadErr.Text = $"Maximum size exceeded. Accepted: {maxFileSizeInKB} KB.";
                    }
                }
                else
                {
                    //INVALID FILE NAME
                    lblPayslipUploadErr.Text = $"Please upload a file with extension {fileExtension}";
                }
            }
        }



Вот такой дизайн

ИЗОБРАЖЕНИЕ

3 Ответов

Рейтинг:
18

Sandeep Mewara

Я перефразирую то, что @F-ES Sitecore, вероятно, намеревался поделиться:
Элемент управления FileUpload не поддерживается при работе с частичным обновлением, так как он требует полной обратной передачи страницы.

Что это означает, два варианта:
1. Используйте PostbackTrigger на UpdatePanel, чтобы это произошло

<asp:UpdatePanel ID="FormUpdatePanel" runat="server">
    <ContentTemplate>
        <div>
            <asp:FileUpload ID="EntryFile1Upload" runat="server" />
            <br />
            <asp:Button ID="UploadButton" OnClick="UploadButton_Click" runat="server" Text="Upload File" />
        </div>
    </ContentTemplate>
    <Triggers>
        <asp:PostBackTrigger ControlID="UploadButton" />
    </Triggers>
</asp:UpdatePanel>
Ссылаться: https://www.surinderbhomra.com/Blog/2018/12/18/Getting-FileUpload-To-Work-Inside-An-UpdatePanel[^]

2. Используйте другой элемент управления, поддерживающий асинхронную загрузку файлов.
В прошлом я использовал следующее: Образец AsyncFileUpload[^]

Кроме того, нашел статью CP о подобном контроле: Асинхронная Загрузка Файлов[^]

Дайте попробовать.


Рейтинг:
1

F-ES Sitecore

FileUpload не работает внутри асинхронной панели обновления, нет никакого обходного пути или исправления. Если вы хотите асинхронную загрузку файла, вам нужно будет использовать какой-то другой метод. Есть много плагинов, которые поддерживают асинхронную загрузку, Если вы google, или html5 имеет встроенную поддержку для него, если вы google "html5 upload file".


Рейтинг:
0

bjay tiamsic

Я использовал асинхронную загрузку файлов, и это спасло меня. Спасибо!