【问题标题】:Upload fails once, then works correctly上传失败一次,然后正常工作
【发布时间】:2010-12-14 13:05:39
【问题描述】:

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

我已将提交按钮添加到更新面板的回发触发器中。 (这是让 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>

【问题讨论】:

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


    【解决方案1】:

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

    还有其他几个库可以进行 AJAX 上传。 Telerik 有一个我以前用过的不错的,但它不是免费的。虽然有一些不错的免费的,但你必须尝试一些。各有优缺点。

    【讨论】:

    • 这不是问题 - 文件上传控件通常在更新面板中正常工作,只要提交上传的按钮导致完整的回发(即,在更新面板中触发为后退触发器)。我之前已经多次使用过这种技术,但是在这种情况下,它在第一次提交时无法正常工作,但在后续提交时可以正常工作。
    【解决方案2】:

    除了我的 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>
    

    【讨论】:

    • 使用 UpdateMode="true" 并手动触发更新时,此问题仍然存在 - 我认为此问题是由其他原因引起的。
    【解决方案3】:

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

    解决方案: 将显示文件上传控件和提交文件上传控件的两个按钮添加到更新面板回发触发器。

    例如:

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

    【讨论】:

    • 如何添加 FileUpload 控件中内置的按钮?
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      我尝试在页面加载事件中添加以下行,它在第一次和以后都有效。

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

      在源代码中显式指定表单标签将不起作用。

      【讨论】:

        猜你喜欢
        • 2011-05-21
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 2018-07-28
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多