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

use*_*235 7 c# asp.net file-upload

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

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

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

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

删除updatepanel,两个uploadcontrols工作正常.

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

是否有某些特定的AJAX版本或.NET版本会导致问题?

这非常令人沮丧.

cal*_*sto 14

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

<asp:UpdatePanel ID="UpdatePanel" runat="server">
    <ContentTemplate>
        <asp:FileUpload ID="FileUpload" runat="server" />
        <asp:Button ID="btnUpload" runat="server" Text="Upload"
           OnClick = "btnUpLoad_OnClick" />               
    </ContentTemplate>
    <Triggers>
        <asp:PostBackTrigger ControlID = "btnUpload" />
    </Triggers>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)

我没有必要做任何不同的服务器端(如user5159158的答案).


Tra*_*ien 9

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

  • 在 WebForms ASP.NET 项目中,只有在页面表单上设置了“enctype”后,我才从“UpdatePanel”内部实现了同步文件上传。将“Bu​​tton”设置为“PostBackTrigger”是必要的,但还不够。另请注意,您也可以将其写为 `Page.Form.Enctype = "multipart/form-data";`。 (2认同)

Win*_*Win 6

上传文件

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

真正让我感到困惑的是,我在另一个项目中使用了它(母版页中的脚本管理器,更新面板中的 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>
Run Code Online (Sandbox Code Playgroud)

异步文件上传

如果您将AsyncFileUploadUpdatePanel一起使用,则AsyncFileUpload.HasFile应仅在UploadedComplete 内检查(您不能在 Button click event 内检查)

原因是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

其他想法

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


小智 6

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

ScriptManager.GetCurrent(this).RegisterPostBackControl(this.YourControlID);
Run Code Online (Sandbox Code Playgroud)