Итак, я создаю собственный календарь (тот, который я нашел бесплатно, не соответствует моим потребностям или слишком неуклюжим, а платные - не бесплатны) в ASP.NET. Я использую несколько UpdatePanels, чтобы изменить месяцы и отображение календарей.Динамически созданный LinkButton, вызывающий UpdatePanel, чтобы сделать полную обратную передачу
В основном поток подобен этому, верхняя UpdatePanel содержит три LinkButtons lbPrev, lbCurr и lbNext и один ярлык lblYear. lbPrev переключает календарь на предыдущий месяц, lbNext на следующий месяц и lbCurr ничего не делает - я просто не изменил его на метку (я могу добавить что-то при нажатии на него - как ежемесячный дисплей, который я не уверен) ,
При нажатии любой из них UpdatePanel работает точно так, как предполагается, обновляя только панель, а не полную обратную передачу.
Вторая из UpdatePanels, назовем ее udpCalMain, содержит сердцевину календаря (все даты), это делается с помощью asp: управления заполнитель, который имеет динамическое отображение LinkButton (с их текстом, являющимся парой divs и изображение).
Идея состоит в том, что при нажатии одной из динамически создаваемых ячеек даты в календаре система обновляет третью UpdatePanel «udpDisplay» с соответствующими данными из базы данных за этот день.
Теперь, когда вы нажимаете какую-либо дату, страница вынуждена делать полную обратную передачу - я знаю, что это связано с тем, что динамически созданный LinkButton отображается как простой тег, и это автоматически заставляет обратную передачу.
Что я пытался сделать, это создать AsyncPostBackTrigger и прикрепить его для каждого динамического создания LinkButton. Однако я не могу найти (внутри элемента управления PlaceHolder) список элементов управления и их идентификаторов, чтобы я мог присоединить этот триггер.
Любая помощь в этом или другом способе избежать полной обратной передачи будет с благодарностью.
Вот код, который я использовал для крепления 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. Любая помощь будет принята с благодарностью.
Мне кажется, что вы хотите просто призвать ajax, чтобы забрать «подходящие детали» для этого дня. Это было бы самым быстрым/простым, если у вас нет веских оснований. – monty