要求
@H_502_2@我正在尝试上传一个文件,一旦用户选择它。我必须满足以下要求:
@H_502_2@>按钮看起来像应用程序中的其他按钮。
>一旦用户选择该文件就上传文件。
>我需要它在UpdatePanel,因为我必须对页面进行条件更新。我可以对所选文件(a.k.a onchange)事件进行完整的回发。 @H_502_2@当前代码 @H_502_2@以下是我的视图文件的外观:
>调用函数onImport,以编程方式点击fileimport按钮。
>用户选择一个文件,然后按打开。
> onFileSelected被调用。
> onUpload被成功调用
> btnUpload_Click每次都被成功调用 @H_502_2@但问题是这个 @H_502_2@fileImport.PostedFile在第一次用户选择文件时为空。一切工作正常,第二次和从那里。 @H_502_2@有关 @H_502_2@This question与我的问题密切相关,但OP可能需要像Gmail一样的Async上传解决方案。我已经尝试过如下这个问题的答案: @H_502_2@> __doPostBack()在btnUpload的OnClientClick事件中
> this.form.submit()onchange事件我的FileUpload控件。
>在Page_PreRender中设置FileUpload控件的onchange属性 @H_502_2@补充笔记 @H_502_2@>当我没有更新面板时,这个东西很好。我正在使用this.form.submit()直接在FileUpload控件的onchange事件中。
>目标框架是.NET 4.0 @H_502_2@注意:在上面的FileUpload控件中添加了Visible =“false”。这是问题,但我在提问时忽视了这个问题。
>一旦用户选择该文件就上传文件。
>我需要它在UpdatePanel,因为我必须对页面进行条件更新。我可以对所选文件(a.k.a onchange)事件进行完整的回发。 @H_502_2@当前代码 @H_502_2@以下是我的视图文件的外观:
<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>@H_502_2@相关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>@H_502_2@代码背后:
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(); } } }@H_502_2@说明/流量 @H_502_2@>用户点击btnFileImportSkin按钮。
>调用函数onImport,以编程方式点击fileimport按钮。
>用户选择一个文件,然后按打开。
> onFileSelected被调用。
> onUpload被成功调用
> btnUpload_Click每次都被成功调用 @H_502_2@但问题是这个 @H_502_2@fileImport.PostedFile在第一次用户选择文件时为空。一切工作正常,第二次和从那里。 @H_502_2@有关 @H_502_2@This question与我的问题密切相关,但OP可能需要像Gmail一样的Async上传解决方案。我已经尝试过如下这个问题的答案: @H_502_2@> __doPostBack()在btnUpload的OnClientClick事件中
> this.form.submit()onchange事件我的FileUpload控件。
>在Page_PreRender中设置FileUpload控件的onchange属性 @H_502_2@补充笔记 @H_502_2@>当我没有更新面板时,这个东西很好。我正在使用this.form.submit()直接在FileUpload控件的onchange事件中。
>目标框架是.NET 4.0 @H_502_2@注意:在上面的FileUpload控件中添加了Visible =“false”。这是问题,但我在提问时忽视了这个问题。