上传失败一次,然后正常工作

时间:2009-11-09 07:07:51

标签: .net asp.net ajax file-upload updatepanel

我正在开发ASP.Net自定义控件。在我的控制中,我在AJAX UpdatePanel内部的MultiView内部有一个FileUpload控件。

我已将提交按钮添加到更新面板的回发触发器。 (这是使FileUpload在UpdatePanel中工作的标准修复方法。)

在第一次提交时,FileUpload不会上传任何内容(即,控件的FileBytes属性的长度为零)。表单上的其他所有内容都会正确提交。

在第二次及以后的提交中,上传工作正常。

可能导致此问题的原因,以及如何解决?


例如:

<asp:UpdatePanel runat="server" ID="update_panel" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:MultiView runat="server" ID="mvMultiView" ActiveViewIndex="0">
            <asp:View runat="server" ID="viewOne">
                <!-- content -->
            </asp:View>
            <asp:View runat="server" ID="viewTwo">
                <!-- some other form elements -->
                <asp:FileUpload ID="file_upload" runat="server" />
                <asp:Button ID="save_button" runat="server" Text="Save" OnClick="save_Click" ValidationGroup="group" />
            </asp:View>
         </asp:MultiView>
    </ContentTemplate>
    <Triggers>
        <asp:PostBackTrigger ControlID="save_button" />
    </Triggers>
</ajax:UpdatePanel>

5 个答案:

答案 0 :(得分:2)

原来这是由部分页面更新期间呈现的FileUpload控件引起的。要正确提交,需要使用完整的回发提交提交FileUpload控件。因为第一个表单提交导致了完整的回发,所以第二次上传开始按预期工作。

<强>解决方案: 添加两个显示的按钮并将文件上载控件提交到更新面板后发触发器。

例如:

   <Triggers>
      <asp:PostBackTrigger ControlID="btnShowUploadForm" />
      <asp:PostBackTrigger ControlID="btnUpload" />
   </Triggers>                            

答案 1 :(得分:1)

FileUpload控件是UpdatePanel不支持的控件之一。

但是还有其他几个库用于进行AJAX上传。 Telerik有一个我以前用过的好的,但它并不是免费的。虽然有一些体面的免费,但你必须尝试一些。每个都有它的优点和缺点。

答案 2 :(得分:1)

除了我的UpdateMode = Conditional:

之外,我的代码几乎与你的代码完全相同
  <asp:UpdatePanel ID="upUpload" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
    <asp:RadioButton ID="rbImage" GroupName="resourceupload" Checked="true" Text="image" runat="server" />
    <asp:RadioButton ID="rbPdf" GroupName="resourceupload" Text="pdf" runat="server" />
     <asp:FileUpload ID="FileUpload1" runat="server"  Width="175"/>
    <asp:Button ID="btnUpload" runat="server" CausesValidation="false"
    Text="Upload" OnClick="btnUpload_Click" />
    <asp:Label ID="lblMsg" Visible="false" runat="server" Text=""></asp:Label>

    </ContentTemplate> 
    <Triggers>
      <asp:PostBackTrigger ControlID="btnUpload" />
      </Triggers>                            
   </asp:UpdatePanel>

答案 3 :(得分:1)

我尝试在页面加载事件中添加以下行,它在第一次及以后的时间运行。

Page.Form.Enctype =“multipart / form-data”;

在源代码中明确指定表单标记将不起作用。

答案 4 :(得分:0)

同时添加btnShowUploadForm的解决方案将否定更新面板的用途。您也可以从更新面板中删除数据访问控制(文件上载控件所在的位置)。更新面板的重点是btnShowUploadForm和取消按钮(取消上传,如果有的话),至少会导致异步后备以获得更好的用户体验。