Mam stronę z ScriptManager, ogólną rozwijaną listą HTML (<select>
) i UpdatePanel. UpdatePanel zawiera PlaceHolder (na razie). Podczas Page_Load do PlaceHolder dodawana jest pewna liczba elementów sterujących użytkownika (tak naprawdę jest to kilka instancji tej samej kontrolki użytkownika). Liczba do dodania nie jest znana, dopóki strona się nie załaduje, więc muszą być ładowane dynamicznie. Lista rozwijana zawiera tę samą liczbę pozycji menu, a na stronie jest również javascript (przy użyciu jQuery), aby wyświetlić tylko jedną z kontrolek na raz w zależności od stanu listy rozwijanej.Dodawanie PostBackTriggers i AsyncPostBackTriggers do UpdatePanel dla dynamicznie generowanych kontrolek wnuków
Każdy element sterujący użytkownika ma dwa przyciski, które powinny generować asynchroniczny oddzwonienie, listę rozwijaną, która powinna generować asynchroniczny odświeżenie po zmianie wybranej wartości, oraz przycisk, który powinien generować synchroniczny odświeżenie. Gdybym nie był generowania dynamicznie kontroli, a jeśli była tylko jedna kontrola, struktura będzie coś takiego:
<asp:UpdatePanel ID="myUpdatePanel" runat="server" UpdateMode="Conditional"
ChildrenAsTriggers="false">
<ContentTemplate>
<asp:TextBox ID="textBox1" runat="server" />
<asp:TextBox ID="textBox2" runat="server" />
<asp:Button ID="asyncButton1" runat="server" Text="Button1"
onclick="asyncButton1_Click" />
<asp:DropDownList ID="asyncDropDown" ruant="server" AutoPostBack="true"
OnSelectedIndexChanged="asyncDropDown_SelectedIndexChanged" />
<asp:Button ID="asyncButton2" runat="server" Text="Button2"
OnClick="asyncButton2_Click" />
<asp:Button ID="syncButton" runat="server" Text="SyncButton"
OnClick="syncButton_Click" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="asyncButton1" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="asyncButton2" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="asyncDropDown"
EventName="SelectedIndexChanged" />
<asp:PostBackTrigger ControlID="syncButton" />
</Triggers>
</asp:UpdatePanel>
Oczywiście, wszystkie kontrole wewnątrz ContentTemplate rzeczywiście być częścią każdej kontroli użytkownika.
Dodanie wyzwalaczy po stronie serwera wydaje się nie działać, ponieważ żaden identyfikator ControlID nie pomaga, aby UpdatePanel znalazł odpowiednie elementy sterujące. Mogę użyć identyfikatora kontrolki lub UniqueID kontrolki, i to nie działa i pojawia się błąd wzdłuż linii
A control with ID 'ctl00$ContentPlaceHolder1$ctl01$asyncButton1' could not be
found for the trigger in UpdatePanel 'myUpdatePanel'.
tak, to zastanawiam się, czy muszę się zarejestrować wyzwalacze w kliencie zamiast korzystania Ajax ASP.NET. Znalazłem this page, który zasadniczo wyjaśnia, w jaki sposób. Jednak nie wiem, jak wziąć EventName pod uwagę. Przykłady, które do tej pory widziałem, dodawały jedynie kliknięcia przycisków, ale nie wiem, jak obsługiwać zdarzenie SelectedIndexChanged z DropDownList.
Każda pomoc tutaj? Czy istnieją przykłady, które przeoczyłem? Nie pomaga oczywiście, że metoda podana w linku, który podałem, wydaje się "nieoficjalna", więc nie widzę żadnych dokumentów MSDN na ten temat.
Dzięki!
Czy korzystasz z .net framework 4.0? Pytam, ponieważ teraz masz większą kontrolę nad Control.ClientID: http://msdn.microsoft.com/en-us/library/system.web.ui.control.clientid.aspx –
@Tim No, to musi być. NET 3.5 na razie. – Andrew
oznaczony jako 3.5. Później przyjrzę się bliżej. –