Objevil jsem jednu nepříliš dokumentovanou vlastnost HoverMenuExtenderu z AjaxControlToolkitu – že umí „vyskakovací“ obsah dočítat pomocí AJAXového callbacku na server. Nastavení je snadné, použijí se property DynamicXyz a jen je potřeba vědět (což se ukázalo jako největší kámen úrazu), jak je to vlastně celé zamýšleno a jak má vypadat serverová metoda (WebService), která má dynamický content vracet:
<asp:Label ID="TargetLb" Text="Ukažte sem, já se dočtu a vyskočím!" runat="server" /> <asp:Panel ID="PopupPanel" Style="display: none;" runat="server"> <%-- display:none - aby se při načítání nepřesýpala obrazovka --%> Statický obsah pop-upu. <asp:Panel ID="DynamicPopupContent" runat="server" /> </asp:Panel> <ajaxToolkit:HoverMenuExtender TargetControlID="TargetLb" PopupControlID="PopupPanel" DynamicServicePath="~/AjaxServices/MyService.asmx" DynamicServiceMethod="GetPopupContent" DynamicContextKey="Kontext, např. ID záznamu" DynamicControlID="DynamicPopupContent" runat="server" />
a služba musím mít signaturu „string DoSomething(string contextKey)“:
[WebService] [ScriptService] public class Sluzby : System.Web.Services.WebService { [WebMethod] [ScriptMethod] public string GetPopupContext(string contextKey) { return "Hello World " + contextKey; } }
Tip 1: Pokud má být celý pop-up tvořen jen dynamickým obsahem, můžete DynamicControlID nastavit na stejný control jako PopupControlID a nemusíte pak vnořovat žádný další Panel (nebo jiný control).
Tip 2: DynamicControlID nemusí být uvnitř PopupControlID, dynamický obsah můžete dočítat i do jiného místa stránky, i když to asi není moc běžné.
Tip 3: Metodu vracející dynamický obsah můžete umístit i přímo do stránky jako PageMethod, musí být pak statická a HoverMenuExtenderu se pak nenastavuje vlastnost DynamicServicePath.