W życiu każdego developera już tak jest, że czasami najdzie go na stworzenie czegoś nowego
Dziś postanowiłem zrobić sobie zestaw kontrolek serwerowych ASP.NET, która integrowałyby kilka funkcjonalności – taki ładny kompozyt. Ponieważ jak każdy porządny developer jestem leniwy i nie mam najmniejszego zamiaru wynajdować koła, postanowiłem wykorzystać dobrodziejstwa jakie niosą ze sobą ASP.NET AJAX oraz AjaxControlToolkit.
Skrypty do kontrolek oparłem o wykorzystanie takich ciekawostek jak:
Type.registerNamespace("Foo.Control");
Ponieważ jestem zwolennikiem „czystego” deploymentu, skrypty osadzane są w bibliotece jako zasoby. W celu użycia należy oczywiście je zarejestrować – np. za pomocą:
Page.ClientScript.RegisterClientScriptResource(GetType(), "Foo.Control.js");
Jak mawiał Dexter (ten z kreskówki): „At last my greatest invention is now completed”. Osadzenie kontrolki na stronie testowej, F5 i…
…komunikat „Type is undefined…”. Ooops.
W czym problem? Ano pech chciał, że skrypty od ASP.NET AJAX są dołączane na stronie PO moich
Pech. W zasadzie to przypadek – ASP.NET nie gwarantuje w tym przypadku kolejności. Co tu zrobić. Ano metody są dwie. Można posłużyć się strasznie brzydką, ale skuteczną metodą a’la brute force:
ScriptManager.RegisterStartupScript(this, GetType(), "Foo.control.js",
String.Format("<script type=\"text/javascript\" src=\"{0}\"><!-- {1}--></script>",
Page.ClientScript.GetWebResourceUrl(GetType(), "Foo.control.js"), "Foo.control.js"), false);
… działa! Jednak jakie to brzydkie.. fuj. Na szczęście istnieje metoda druga (z pewnością istnieją także trzecia, czwarta, …):
ScriptManager scriptManager = ScriptManager.GetCurrent(Page);
if (scriptManager == null) { throw new Exception("ScriptManager is required");
scriptManager.Scripts.Add(new ScriptReference("Foo.Control.js", GetType().Assembly.FullName));
… super i jak ładnie