asp.net - 第一次无法在更新面板内自动将文件上传到服务器

标签 asp.net file-upload webforms updatepanel

要求

我正在尝试上传文件,只要用户选择它。我必须满足以下要求:

  • 该按钮看起来像应用程序中的其他按钮。
  • 用户选择文件后,文件就会立即上传。
  • 我需要它在 UpdatePanel 中,因为我必须对页面进行有条件的更新。我 可以对所选文件(又名 onchange)事件进行完整回发。

  • 当前代码

    以下是我的 View 文件的外观:
    <asp:UpdatePanel ID="upData" UpdateMode="Conditional" runat="server">
        <ContentTemplate>
    
        <div style="width: auto; float: right;">
    
        <asp:Button ID="btnFileImportSkin" CssClass="ButtonSkin AddButton" Text="Import" Style="position: absolute; z-index: 2;" runat="server" OnClientClick="Javascript:onImport(); return false;" />
        <asp:FileUpload ID="fileImport" Visible="false" Style="position:relative; opacity:0;" runat="server" onchange="Javascript:onFileSelected();"  /> 
               <%-- onchange="Javascript:this.form.submit();" /> --%>
               <%-- <asp:Button ID="btnUpload" runat="server" OnClientClick="Javascript:alert('Uploading...'); __doPostBack('<%= btnUpload.ID %>', ''); return false;" /> --%>
        <asp:Button ID="btnUpload" OnClick="btnUpload_Click" runat="server" />
        </div>
    
        </ContentTemplate>
        <Triggers>
            <asp:PostBackTrigger ControlID="btnUpload" />
        </Triggers>
    </asp:UpdatePanel>
    

    相关的Javascript:
    <script type="text/javascript">
        function onImport() {
            var fileImportClientId = '<%= fileImport.ClientID %>';
            document.getElementById(fileImportClientId).click();
        }
    
        function onFileSelected() {
            alert("File Selected");
            // I have tried calling the function directly and with a timeout
            setTimeout(onUpload, 20);
        }
    
        function onUpload() {
            var btnUploadClientId = '<%= btnUpload.ClientID %>';
            document.getElementById(btnUploadClientId).click();
        }
    </script>
    

    后面的代码:
    protected void btnUpload_Click(object sender, EventArgs e)
    {
        // PostedFile is null first time code gets here on user selecting a file
        if (fileImport.PostedFile != null)
        {
            if (fileImport.PostedFile.FileName.Length > 0)
            {
                ImportFromFile();
            }
        }
    }
    

    解释/流程
  • 用户点击btnFileImportSkin按钮。
  • 函数onImport被调用,它以编程方式点击 fileimport按钮。
  • 用户选择一个文件,然后按打开。
  • onFileSelected叫做。
  • onUpload被成功调用。
  • btnUpload_Click每次都调用成功。

  • 然而 问题 就是它

    用户第一次选择文件时,fileImport.PostedFile 为 null。第二次一切正常,从那时起。

    相关

    This question与我的问题密切相关,但 OP 可能想要像 Gmail 中的异步上传解决方案。我已经尝试在这个问题的答案中执行以下操作:
  • btnUpload 的 OnClientClick 事件中的 __doPostBack()
  • 我的 FileUpload 的 this.form.submit() onchange 事件控制。
  • 设置 FileUpload 的 onchange 属性Page_PreRender 中的控制

  • 附加说明
  • 当我没有更新面板时,这件事工作得很好。我在 FileUpload 的 onchange 事件中直接执行 this.form.submit()控制。
  • 目标框架是 .NET 4.0

  • 注意:在 FileUpload 中添加了 Visible="false"控制上面。这是问题所在,但我在提问时忽略了它。

    最佳答案

    当针对 .Net 4.5 和 4.0 框架版本时,此代码适用于我。我将您的代码复制/粘贴到一个新的 Web 窗体应用程序中,并且在这两种情况下 fileImport.PostedFile 都不为空,而是包含我选择的图像的流。

    您页面上的任何其他标记是否存在问题?或者你的页面生命周期?您在用户控件或 Web 表单页面上发布的 html/javascript 是什么?

    关于asp.net - 第一次无法在更新面板内自动将文件上传到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34227505/

    相关文章:

    asp.net - 如何防止 ASP.NET MVC 将日期从 UTC 转换为本地?

    javascript - JQuery 滚动事件在回发后不会立即触发

    Javascript,计算有多少文件附加到文件上传输入

    java - 如何从客户端直接上传图片到服务器

    c# - 如何判断我的站点运行的是 ASP.NET MVC 还是 Web 窗体?

    c# - 为什么要创建 ASP.NET 5 类库项目?

    file-upload - Dropbox API : Upload a File to Root directory for app with Full Dropbox

    c# - asp 图片根本不显示

    mysql - 创建学生测试的项目/Web 应用程序,在其中我们收集来自 "Form"的输入,并将它们存储在数据库中,并进一步访问它们

    asp.net - 当使用 ASP.Net Membership 加上一个附加表来存储用户信息时,我应该将其他表链接到 aspnetUsers 还是我自己的表?