UpdatePanel中的ASP.NET FileUpload - 仍然无法正常工作

时间:2014-10-15 18:26:06

标签: c# asp.net file-upload

尝试在NET 4.5 / C#Web应用程序的updatepanel中使用FileUpload或AsyncFileUpload控件。

我已尝试在我的母版页中使用标准Scriptmanager或ToolKitScriptManager。

我的保存按钮设置为PostBackTrigger(也尝试过AsyncPostbackTrigger)。

无论如何,我的(异步)FileUpload.HasFile总是返回false。

删除updatepanel,两个uploadcontrol都可以正常工作。

真正让我感到震惊的是我在另一个项目中工作(masterpage中的scriptmanager,updatepanel中的Fileupload,SaveButton是PostbackTrigger)。

是否存在可能导致问题的特定AJAX版本或.NET版本?

这非常令人沮丧。

4 个答案:

答案 0 :(得分:11)

将按钮添加到UpdatePanel的触发器标签,我得到了它的工作:

<link rel="stylesheet" href="https://rawgit.com/esvit/ng-table/master/dist/ng-table.min.css">
<script src="https://rawgit.com/esvit/ng-table/master/dist/ng-table.min.js"></script>

我没有必要做任何不同的服务器端(如user5159158&#39;)

答案 1 :(得分:6)

文件上传不适用于部分回发。它需要完整的页面请求。因此,请在页面加载中添加以下行。

ScriptManager.GetCurrent(this).RegisterPostBackControl(this.YourControlID);

答案 2 :(得分:2)

文件上传

FileUpload需要完整页面请求。这是对所有AJAX框架中使用的XmlHttpRequest组件的限制,用于对应用程序的异步调用。

  

真正让我感到震惊的是我在另一个项目中工作   (masterpage中的scriptmanager,updatepanel中的Fileupload,SaveButton是   PostbackTrigger)。

我认为你正在使用Full PostBack,虽然 FileUpload位于** UpdatePanel 内。

例如,

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
   <ContentTemplate>
      <asp:FileUpload ID="FileUpload1" runat="server" />
      <asp:Button ID="SaveButton" runat="server" OnClick="SaveButton_Click" 
          Text="Upload your file" />
   </ContentTemplate>
   <Triggers>
      <asp:PostBackTrigger ControlID="SaveButton" />
   </Triggers>
</asp:UpdatePanel>

AsyncFileUpload

如果您将 AsyncFileUpload UpdatePanel 一起使用,则 AsyncFileUpload.HasFile 应仅在 UploadedComplete 内进行检查(你无法检查内部按钮点击事件)

原因是 AsyncFileUpload 通过 Async 单独上传文件。

注意: 确保使用ToolkitScriptManager而不是ScriptManager

<ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManager1" runat="Server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <ajaxToolkit:AsyncFileUpload runat="server" ID="AsyncFileUpload1"
            OnUploadedComplete="AsyncFileUpload1_UploadedComplete" />
        <asp:TextBox runat="server" ID="TextBox1" /><br/>
        <asp:Button ID="SaveButton" runat="server" OnClick="SaveButton_Click"
            Text="Save" />
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="SaveButton" />
    </Triggers>
</asp:UpdatePanel>

private string FileName
{
    get { return (string)(Session["FileName"] ?? ""); }
    set { Session["FileName"] = value; }
}

protected void SaveButton_Click(object sender, EventArgs e)
{
    string fileName = FileName;
    string path = Server.MapPath("~/App_Data/");
    var fileInfo = new FileInfo(path + FileName);
}

protected void AsyncFileUpload1_UploadedComplete(object sender, 
    AsyncFileUploadEventArgs e)
{
    if (AsyncFileUpload1.HasFile)
    {
        FileName = AsyncFileUpload1.FileName;
        string path = Server.MapPath("~/App_Data/");
        AsyncFileUpload1.SaveAs(path + AsyncFileUpload1.FileName);
    }
}

其他想法

我个人不喜欢在 UpdatePanel 中使用 AsyncFileUpload 。相反,如果我需要上传文件,我宁可使用Full PostBack。

答案 3 :(得分:2)

在Page_Load中添加:Page.Form.Attributes.Add("enctype", "multipart/form-data");