文件上传在UpdatePanel中嵌套时无法工作?C#

18
 <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。我不知道为什么会这样,但当我把它放在更新面板中时它就停止工作了。

我已经看到一些关于此的其他线程。但它们没有回答为什么会发生这种情况,只是指向你可以下载的东西。

编辑:我想做这件事的主要原因是让客户上传到服务器时出现“..正在上传文件..”标签,并在完成后在数据列表中显示。我只是无法使UpdateProgress正常工作。


这篇文章帮助了我,提供了清晰的解释。 - raw_hitt
3个回答

19

基本上,您只需要使按钮执行完整的后端提交以发送文件。还要确保在您的代码中设置了这个.Form.Enctype = "multipart/form-data";,或者您可以将 放在那个页面中。由于安全原因,异步后端提交不适用于文件,除非使用一些技巧。 (我从未能够让它正常工作)。

 <asp:UpdatePanel ID="UpdatePanel1" runat="server">
      <ContentTemplate>
           <asp:FileUpload onchange="clickTheButton();" ID="FileUpload1" runat="server" />
      </ContentTemplate>
      <Triggers>
         <asp:PostBackTrigger ControlID="Button1" />
      </Triggers>
 </asp:UpdatePanel>

更新进度条不能与完整的页面回传一起使用,对吧? - Jason
没错,除非你的浏览器在回传期间显示一个加载进度条,否则你将无法监控进度。然而,这种方式在所有浏览器上似乎并不可靠。 - jamone
这是非常老的技术,现在我们可以通过JS进行postback,但是如何实现呢? - Adeem

4

出于安全考虑,浏览器不允许您通过javascript发布文件。想象一下,如果我能编写一点javascript代码,将您的“我的文档”文件夹的内容异步提交到我的服务器。

因此,类似于UpdatePanel使用的XMLHttpRequest的javascript式表单提交方法将无法工作。

如果您使用的是3.5 SP1,则本帖描述了一个不错的解决方法。链接

如果您不想使用AjaxControlToolkit,则本帖描述了几种解决方法。链接


请注意,此答案已经过时,因为它先于HTML5文件上传(以及更新的文件系统访问API)的存在。 - Brian

4
文件上传不支持部分页面回发。因此,在页面加载时添加以下代码即可解决问题。
ScriptManager.GetCurrent(this).RegisterPostBackControl(this.YourControlID);

或者使用PostBackTrigger

<Triggers>
            <asp:PostBackTrigger ControlID="YourControlID" />
</Triggers>

或者您需要使用AjaxControl Toolkit中定义的特殊AsyncFileUpload控件。
<ajaxToolkit:AsyncFileUpload OnClientUploadError="uploadError"
     OnClientUploadComplete="uploadComplete" runat="server"
     ID="AsyncFileUpload1" Width="400px" UploaderStyle="Modern"
     UploadingBackColor="#CCFFFF" ThrobberID="myThrobber" />

您可以在这里查看相关信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接