ASP.NET - 带PostBack触发器的FileUpload

时间:2010-05-07 11:57:08

标签: asp.net ajax updatepanel postback

我有一个UpdatePanel,它有一个上传控件和一个上传按钮。该按钮被设置为触发器,但该按钮的事件处理程序无法在第一个PostBack上执行。

我的ASPX代码是:

<asp:UpdatePanel ID="updPages" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <div class="tabs">
            <ul>
                <li><asp:LinkButton ID="lnkContentsPages" runat="server" OnClick="updateContents" CommandArgument="pages">Pages</asp:LinkButton></li>
        <%-- these tabs change the ActiveViewIndex to show a different UserControl --%>
                <li><asp:LinkButton ID="lnkContentsImages" runat="server" OnClick="updateContents" CommandArgument="images">Images</asp:LinkButton></li>
            </ul>
            <div class="tabbedContent">
                <asp:MultiView runat="server" ID="mltContentsInner" ActiveViewIndex="0">
                    <asp:View ID="viwContentsImages" runat="server">
                        // ajax usercontrol for a list of images - works fine with ajax
                        <fieldset>
                            <legend>Upload New</legend>
                            <div class="formRow">
                                <asp:Label ID="lblFile" runat="server" Text="Filename" AssociatedControlID="uplFile" />
                                <asp:FileUpload ID="uplFile" runat="server" />
                            </div>
                            <div class="formRow">
                                <asp:Label ID="lblImageDescription" runat="server" Text="Description" AssociatedControlID="txtImageDescription" />
                                <asp:TextBox runat="server" ID="txtImageDescription" />
                            </div>
                            <asp:Button ID="btnUpload" runat="server" Text="Upload" CssClass="c3button btnUpload" CausesValidation="false" OnClick="btnUpload_Click" />
                        </fieldset>
                    </asp:View>
                    <asp:View ID="viwContentsPages" runat="server">
                        // ajax usercontrol - works fine with ajax
                    </asp:View>
                </asp:MultiView>
            </div>
        </div>
    </ContentTemplate>
    <Triggers>
        <asp:PostBackTrigger ControlID="btnUpload" />
    </Triggers>
</asp:UpdatePanel>

按钮在第二次和随后的时间内都能正常工作,而不是第一次。这有什么理由吗?

4 个答案:

答案 0 :(得分:3)

需要在页面的表单标记中添加enctype =“multipart / form-data”。

面临同样的问题,上面的工作使它在第一次尝试时上传文件。希望有人会觉得它很有用。

答案 1 :(得分:1)

我不知道为什么会这样。但是,您可以通过覆盖aspx.cs文件中的OnInit页面循环事件来尝试自己添加事件。请记住从HTML页面中删除Click事件。

protected override void OnInit(EventArgs e)
{

btnUpload.Click+= new EventHandler(btnUpload_Click);
base.OnInit(e);
}

或者,Trigger可能还需要直接位于UpdatePanel标记

下面
<asp:UpdatePanel ID="updPages" runat="server" UpdateMode="Conditional">  
 <Triggers> 
        <asp:PostBackTrigger ControlID="btnUpload" /> 
    </Triggers> 

答案 2 :(得分:1)

也许是第一次进行AJAX回发?在UpdatePanel上,尝试添加属性ChildrenAsTriggers="false"

这将停止UpdatePanel中的任何控件导致异步回发,因此对于您想要导致回发的每个控件,您必须在UpdatePanel的AsyncPostBackTrigger中添加Triggers {1}}部分。

答案 3 :(得分:0)

根据anbalagan的回答和另一个问题的答案,您应该将表单元素的enctype属性更改为“multipart / form-data”。正如在this question's最佳答案中所说,每当您编写客户端代码并且需要将文件发布到服务器时,应该使用'multipart / form-data',例如使用FileUpload控件。

我和你的问题一样,改变了表格的enctype,现在一切正常。