【问题标题】:FileUpload.PostedFile always null inside UpdatePanelFileUpload.PostedFile 在 UpdatePanel 中始终为空
【发布时间】:2011-09-10 03:57:21
【问题描述】:

我在 UpdatePanel 中有一个 FileUpload 控件。我已经成功地向脚本管理器注册了上传按钮以进行完整的回发。我唯一的问题是 FileUpload.HasFile 总是返回 null。 注意:当我将 FileUpload 控件移到更新面板之外时,一切正常文件。是否有解决方案或解决方法。

谢谢。

【问题讨论】:

  • AsyncFileUpload 控件不适合我。
  • 最糟糕的是,如果我使用普通的 HTML 文件输入控件并回发,Request.Files.Count 返回 0(如果它在更新面板中)。太奇怪了。
  • 好的,以防万一其他人可能会穿上这双鞋。我终于找到了我的错误来源。我的文件上传控件放置在启动时具有 Visible="False" 的面板内,并在用户单击按钮时显示(该按钮未注册为完整的回发控件。我认为这是问题所在)。所以我也用脚本管理器注册了显示上传面板的按钮。现在一切正常!!!

标签: c# asp.net file-upload updatepanel


【解决方案1】:

您可以将 FileUpload 控件放在 UpdatePanel 中,但您必须使用 PostBackTrigger 而不是 AsyncPostBackTrigger。我最近使用了这种方法,并结合了两种类型的触发器。

    <Triggers>
        <asp:PostBackTrigger ControlID="btnSave" />
        <asp:AsyncPostBackTrigger ControlID="btnAsyncSave"/>
    </Triggers>

PostBackTrigger 用于文件上传,而 AsyncPostBackTrigger 用于所有其他表单字段。

【讨论】:

  • 我的按钮正在将文件名和其他一些值保存到数据库中。它的 id 是'btnSave',那么在 PostBackTrigger 中应该是什么 ControlID,在 AsyncPostBackTrigger 中应该是什么。您的代码似乎有 2 个按钮?
  • 我的代码是针对 UpdatePanel 内的 FileUpload 控件的特定示例 - 这仅适用于 PostBackTrigger,不适用于 AsyncPostBackTrigger。我有 2 个按钮用于我正在使用的其他控件,它们不是 FileUpload,因此可以异步工作。
  • 对于刚刚来到这里的用户,从技术上讲,您不需要AsyncPostBackTrigger,除非您的控件需要它才能让 UpdatePanel 识别它们。我发现 Async 带来的麻烦多于它的价值。
【解决方案2】:

FileUpload 在 UpdatePanel 中不起作用。您必须使用 ASPNET AJAX 控件工具包中的AsyncFileUpload


当您使用 AsyncFileUpload 时,您必须在 form 标记中设置正确的参数,该标记位于您的 Page 或 MasterPage 中:

<form id="form1" runat="server" enctype="multipart/form-data" method="post">

如果您没有设置正确的 enctype 和方法 UploadedComplete 将永远不会触发,那么您将无法获得 FileUpload.FileBytes,因为 FileUpload .HasFile 仅在 UploadedComplete 执行期间返回 true。


此外,以前版本的 AsyncFileUpload 无法在 Chrome 上运行。实际版本(4.1.50731.0)解决了这个问题。

【讨论】:

    【解决方案3】:

    这是一个可以追溯到 MSAjax 1.0 的老问题。 FileUpload 控件与更新面板的工作方式和脚本管理器不兼容。文件上传会修改数据流,导致脚本管理器阻塞。唯一可行的方法是将文件上传控件放在更新面板之外。如果页面上有其他控件依赖于文件上传控件,则需要设置添加 PostBack 触发器。

    【讨论】:

      【解决方案4】:
      <Triggers>
              <asp:PostBackTrigger ControlID="btnSave" />
      </Triggers>
      

      在更新面板之外有文件上传控件。如果页面上有其他控件依赖于文件上传控件,则需要设置添加 PostBack 触发器。

      【讨论】:

        【解决方案5】:

        我遇到的问题是触发回发的按钮位于 UpdatePanel 中(不知道为什么)。将它们移到 UpdatePanel 之外解决了这个问题。

        【讨论】:

          猜你喜欢
          • 2017-10-11
          • 2016-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-31
          • 2019-07-18
          • 2019-08-18
          • 2011-12-29
          相关资源
          最近更新 更多