动态创建LinkBut​​ton导致UpdatePanel执行完全回发

时间:2015-03-19 02:11:01

标签: c# asp.net updatepanel linkbutton dynamic-controls

好的,所以我在ASP.NET中创建了一个自定义日历(我发现这个日历是免费的,不符合我的需求,或者太笨重,付费的不是免费的)。我正在使用许多UpdatePanel来允许更改月份和日历的显示。

基本上流程是这样的,上面的UpdatePanel包含三个LinkBut​​tons lbPrev,lbCurr和lbNext以及一个Label lblYear。 lbPrev将日历切换到上个月,lbNext切换到下个月,lbCurr什么都不做 - 我还没有将它改为标签(我可能会点击它时添加一些内容 - 就像每月显示我不确定)

当点击其中任何一个时,UpdatePanel完全按照预期工作,只更新面板本身,而不是完整的回发。

UpdatePanels中的第二个,我们称之为udpCalMain,包含日历的核心(所有日期),这是通过asp:占位符控件完成的,其中LinkBut​​ton动态呈现(其文本为几个div)和图像)。

当您在日历上单击其中一个动态创建的日期单元格时,系统会更新第三个UpdatePanel“udpDisplay”,其中包含当天数据库中的相关详细信息。

现在,无论何时单击任何日期,页面都被强制执行完全回发 - 我知道这是因为动态创建的LinkBut​​ton呈现为一个简单的标记,这会自动强制回发。

我尝试做的是创建一个AsyncPostBackTrigger并为每个动态创建的LinkBut​​ton附加它。但是,我找不到(在PlaceHolder控件内)控件及其id的列表,以便我可以附加此触发器。

任何有关这样做或其他避免完整回发的方法的帮助都将非常感激。

以下是我用来附加AsyncPostBackTrigger的代码:

    AsyncPostBackTrigger apbtDate = new AsyncPostBackTrigger();
    apbtDate.ControlID = "ctl00$cpMain$CalendarBase$ctll01"; //Just an example
    apbtDate.EventName = "Click";
    udp1.Triggers.Add(apbtDate);

这是UpdatePanels的显示代码:

    <asp:UpdatePanel ID="udp1" runat="server" EnableViewState="True" ChildrenAsTriggers="False" UpdateMode="Conditional">
        <ContentTemplate>
            <div style="width: 700px; float: left">
                <div style="width: 700px; text-align: center">
                    <asp:Label ID="lblYear" runat="server" />
                </div>
                <div style="float: left; width: 200px; text-align: center">
                    <asp:LinkButton ID="lbPrev" runat="server" OnClick="lbPrev_Click" />
                </div>
                <div style="float: left; width: 300px; text-align: center">
                    <asp:LinkButton ID="lbCurr" runat="server" />
                </div>
                <div style="float: left; width: 200px; text-align: center">
                    <asp:LinkButton ID="lbNext" runat="server" OnClick="lbNext_Click" />
                </div>
            </div>
        </ContentTemplate>
    </asp:UpdatePanel>
    <asp:UpdatePanel ID="udpCalMain" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional">
        <ContentTemplate>
            <div style="width: 700px; height: 700px">
                <asp:PlaceHolder ID="phCalendar" runat="server" />
            </div>
        </ContentTemplate>
    </asp:UpdatePanel>
</div>
<asp:UpdatePanel ID="udpDisplay" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false">
    <ContentTemplate>
        <div style="width: 300px; float: left; height: 35px">

        </div>
        <div style="width: 300px; float: left">
            <asp:Label ID="lblTest" runat="server" />
        </div>
    </ContentTemplate>
</asp:UpdatePanel>

基本上,我需要一种在Placeholder中创建可点击元素的方法,它不会导致完整的Postback。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

好的,所以我偶然发现了答案。我只是在代码隐藏中向LinkBut​​ton添加了一个ID,我没有考虑到这一点。但是,显然未命名(没有ID)LinkBut​​tons只是触发了导致完整回发的默认行为。命名LinkBut​​ton然后导致PlaceHolder中的结果控件正常运行,并且不会导致完整的回发。