好的,所以我在ASP.NET中创建了一个自定义日历(我发现这个日历是免费的,不符合我的需求,或者太笨重,付费的不是免费的)。我正在使用许多UpdatePanel来允许更改月份和日历的显示。
基本上流程是这样的,上面的UpdatePanel包含三个LinkButtons lbPrev,lbCurr和lbNext以及一个Label lblYear。 lbPrev将日历切换到上个月,lbNext切换到下个月,lbCurr什么都不做 - 我还没有将它改为标签(我可能会点击它时添加一些内容 - 就像每月显示我不确定)
当点击其中任何一个时,UpdatePanel完全按照预期工作,只更新面板本身,而不是完整的回发。
UpdatePanels中的第二个,我们称之为udpCalMain,包含日历的核心(所有日期),这是通过asp:占位符控件完成的,其中LinkButton动态呈现(其文本为几个div)和图像)。
当您在日历上单击其中一个动态创建的日期单元格时,系统会更新第三个UpdatePanel“udpDisplay”,其中包含当天数据库中的相关详细信息。
现在,无论何时单击任何日期,页面都被强制执行完全回发 - 我知道这是因为动态创建的LinkButton呈现为一个简单的标记,这会自动强制回发。
我尝试做的是创建一个AsyncPostBackTrigger并为每个动态创建的LinkButton附加它。但是,我找不到(在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。任何帮助将不胜感激。
答案 0 :(得分:1)
好的,所以我偶然发现了答案。我只是在代码隐藏中向LinkButton添加了一个ID,我没有考虑到这一点。但是,显然未命名(没有ID)LinkButtons只是触发了导致完整回发的默认行为。命名LinkButton然后导致PlaceHolder中的结果控件正常运行,并且不会导致完整的回发。