Nieznających tematu zapraszam do pierwszego odcinka po wyjaśnienia.
Odcinek drugi. Metoda HttpModule.
Mechanizm modułów HTTP pozwala nam wpiąć się w proces przetwarzania żądania przez serwer ASP.NET. Mając do dyspozycji całą masę zdarzeń udostępnianych przez klasę HttpApplication możemy zmodyfikować praktycznie dowolny element w łańcuchu obsługi żądania. W tym przypadku wykorzystamy możliwość dobrania się do docelowej strony i podczas zdarzenia Load zmodyfikujemy zawartego na niej ScriptManagera:
-
- implementujemy moduł realizujący wymaganą funkcjonalność (użyjemy metody AllChildControls(), którą przedstawiłem jakiś czas temu):
1: using System.Linq; 2: using System.Web; 3: using System.Web.UI; 4: 5: public class ScriptManagerWebKitModule : IHttpModule 6: { 7: public void Init(HttpApplication context) 8: { 9: context.PreRequestHandlerExecute += context_PreRequestHandlerExecute; 10: } 11: 12: public void Dispose() 13: { 14: // nothing to do here... 15: } 16: 17: void context_PreRequestHandlerExecute(object sender, System.EventArgs e) 18: { 19: var page = ((HttpApplication)sender).Context.CurrentHandler as Page; 20: 21: // we're only interested in Page handlers 22: if (page != null) 23: page.Load += page_Load; 24: } 25: 26: void page_Load(object sender, System.EventArgs e) 27: { 28: // only one ScriptManager per page is allowed 29: ScriptManager scriptManager = ((Page)sender).AllChildControls().OfType<ScriptManager>().SingleOrDefault(); 30: 31: if (scriptManager != null) 32: { 33: ScriptReference scriptReference = new ScriptReference("~/Scripts/webkit.js"); 34: scriptManager.Scripts.Add(scriptReference); 35: } 36: } 37: }
- rejestrujemy moduł w sekcji system.web/httpmodules w web.config:
- implementujemy moduł realizujący wymaganą funkcjonalność (użyjemy metody AllChildControls(), którą przedstawiłem jakiś czas temu):
<httpModules>
<add name=”WebKitModule” type=”ScriptManagerWebKitModule, myWebApp, Version=1.0.0.0, Culture=neutral”/>
W ten oto sposób mamy działające rozwiązanie niewymagające ingerowania w już utworzone strony i bezmyślnego modyfikowania każdej instancji ScriptManagera z osobna.
Następnym razem osiągniemy to samo za pomocą mechanizmu Control Adapters.
Dzięki , na to czekałem. Na pewno się przyda
Spoko, w pon/wt będzie lepsze rozwiązanie:)
Mała rada. Zamiast wyszukiwania w kontrolkach obiektu typu ScriptManager, można skorzystać z metody statycznej ScriptManager.GetCurrent(page).