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

Dynamically Created LinkButton causing UpdatePanel to do Full Postback

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

基本上流程是这样的,上面的UpdatePanel包含lbPrev,lbCurr,lbNext三个LinkBut​​tons和一个Label lblYear。 lbPrev 将日历切换到上个月,lbNext 切换到下个月,lbCurr 什么都不做——我只是还没有把它改成标签(我可能会在点击它时添加一些东西——比如每月显示我不确定) .

单击其中任何一个时,UpdatePanel 将按预期工作,仅更新面板本身,而不是完整的回发。

第二个 UpdatePanels,我们称之为 udpCalMain,包含日历的核心(所有日期),这是通过 asp:Placeholder 控件完成的,该控件具有动态呈现的 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);

这里是更新面板的显示代码:

    <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>

基本上,我需要一种方法来在占位符内创建不会导致完整回发的可点击元素。任何帮助将不胜感激。

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