代码之家  ›  专栏  ›  技术社区  ›  Echilon Mafarnakus

ASP.NET-带回发触发器的文件上载

  •  3
  • Echilon Mafarnakus  · 技术社区  · 15 年前

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

    <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 回复  |  直到 15 年前
        1
  •  3
  •   anbalagan    12 年前

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

        2
  •  1
  •   Jonathan    15 年前

    我不知道为什么会这样。但是,您可以尝试通过重写aspx.cs公司文件。记住要从HTML页面中删除Click事件。

    protected override void OnInit(EventArgs e)
    {
    
    btnUpload.Click+= new EventHandler(btnUpload_Click);
    base.OnInit(e);
    }
    

    或者,触发器也可能需要直接定位在UpdatePanel标记的正下方

    <asp:UpdatePanel ID="updPages" runat="server" UpdateMode="Conditional">  
     <Triggers> 
            <asp:PostBackTrigger ControlID="btnUpload" /> 
        </Triggers> 
    
        3
  •  1
  •   Graham Clark    15 年前

    可能是第一次做AJAX回发?在你的 UpdatePanel ,尝试添加属性 ChildrenAsTriggers="false" .

    这将停止UpdatePanel中导致异步回发的任何控件,因此对于每个控件 希望 要引起回发,您必须添加 AsyncPostBackTrigger 在UpdatePanel的 Triggers 第节。

        4
  •  0
  •   Community CDub    8 年前

    根据anbalagan的回答和另一个问题的答案,您应该将form元素的enctype属性更改为“multipart/formdata”。正如在 this question's 最好的答案是,无论何时编写客户端代码并需要将文件发布到服务器,例如使用FileUpload控件,都应该使用“multipart/formdata”。