Pierwszy odcinek. Drugi odcinek.
Odcinek trzeci. Ostatni. Metoda ControlAdapter.
Mechanizm ControlAdapters umożliwia przejęcie kontroli nad sposobem renderowania kontrolek danego typu w zależności od przeglądarki, z której przyszło żądanie. Możemy dzięki temu stworzyć alternatywny wygląd kontrolek dla urządzeń mobilnych, czy zmienić standardowy lamerski “tabelkowy” sposób renderowania menu ASP.NET (co nota bene zostało zrobione przez autorów CSS Friendly Control Adapters).
W naszym przypadku będziemy modyfikować ScriptManagery niezależnie od typu przeglądarki, która wysłałą żądanie – zawsze dodamy “fixujący” skrypt (stąd refID=”Default”).
Po kolei należy uczynić co następuje:
-
- implementujemy ControlAdapter realizujący wymaganą funkcjonalność, czyli dodanie skryptu do ScriptManagera podczas zdarzenia Load:
1: using System.Web.UI; 2: using System.Web.UI.Adapters; 3: 4: public class ScriptManagerWebKitAdapter : ControlAdapter 5: { 6: protected override void OnLoad(System.EventArgs e) 7: { 8: ScriptReference scriptReference = new ScriptReference("~/Scripts/webkit.js"); 9: 10: ((ScriptManager)this.Control).Scripts.Add(scriptReference); 11: 12: base.OnLoad(e); 13: } 14: }
- tworzymy plik z rozszerzeniem *.browser (na przykład ScriptManager.browser) w katalogu App_Browsers i rejestrujemy w nim nasz adapter:
- implementujemy ControlAdapter realizujący wymaganą funkcjonalność, czyli dodanie skryptu do ScriptManagera podczas zdarzenia Load:
<browsers> <browser refID="Default"> <controlAdapters> <adapter controlType="System.Web.UI.ScriptManager" adapterType="ScriptManagerWebKitAdapter, myWebApp" /> </controlAdapters> </browser> </browsers>
Od tej pory wszystkie ScriptManagery otrzymają dodatkowy skrypt, który naprawi MS Ajax w przeglądarkach bazujących na WebKit.
Podsumowanie
W tym krótkim minicyklu przyjrzeliśmy się trzem różnym sposobom implementacji dokładnie tej samej funkcjonalności. Metoda pierwsza, czyli kopiuj/wklej, powinna u każdego w każdym przypadku zapalać między uszami lampkę z krwistoczerwonym napisem “NA 90% DA SIĘ TO ZROBIĆ LEPIEJ!”. Metoda druga, czyli HttpModule, wykorzystuje bardzo potężny mechanizm. W tym przypadku jednak jest to jak strzelanie z armaty do kaczki (mmm…) i nie ma konieczności uciekania się do czegoś tak “poważnego”. Rozwiązaniem idealnym wydaje się być metoda trzecia, Control Adapters, który jest chyba najmniej znanym i najrzadziej wykorzystywanym obszarem ASP.NET. A szkoda, bo drzemie w nim olbrzymi potencjał, dlatego zachęcam do dokładniejszego zapoznania się z tym tematem.