【问题标题】:Dynamically Created LinkButton causing UpdatePanel to do Full Postback动态创建的 LinkBut​​ton 导致 UpdatePanel 执行完整的回发
【发布时间】:2015-03-19 02:11:00
【问题描述】:

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

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

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

UpdatePanel 的第二个,我们称之为 udpCalMain,包含日历的核心(所有日期),这是通过动态呈现 LinkBut​​ton 的 asp:Placeholder 控件完成的(它们的文本是几个 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>

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

【问题讨论】:

  • 在我看来,您想要的只是一个 ajax 调用来获取当天的“相关细节”。这将是最快/最简单的,除非您有充分的理由不这样做。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 2013-07-02
    • 2011-02-10
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多