ASP.NET AJAX a kolejność rejestrowania skryptów

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 :)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>