【发布时间】:2016-03-17 14:24:43
【问题描述】:
要求
我正在尝试上传文件,只要用户选择它。我必须满足以下要求:
- 该按钮与应用程序中的其他按钮相似。
- 文件在用户选择后立即上传。
- 我需要它在 UpdatePanel 中,因为我必须对页面进行有条件的更新。我可以对文件选择 (a.k.a
onchange) 事件进行完整回发。
当前代码
以下是我的视图文件的外观:
<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 在用户第一次选择文件时为空。第二次一切正常,从那时起。
相关
This question 与我的问题密切相关,但 OP 可能需要像 Gmail 中的异步上传解决方案。我已经尝试在此问题的答案中执行以下操作:
- __doPostBack() 在
btnUpload的 OnClientClick 事件中 - this.form.submit() 我的
FileUpload控件的onchange 事件。 - 在Page_PreRender中设置
FileUpload控件的onchange属性
附加说明
- 当我没有更新面板时,这件事可以完美运行。我在
FileUpload控件的onchange 事件中直接执行this.form.submit()。 - 目标框架是 .NET 4.0
注意:在上面的 FileUpload 控件中添加了 Visible="false"。这是问题,但我在提问时忽略了它。
【问题讨论】:
标签: asp.net file-upload webforms updatepanel