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:
15: }
16:
17: void context_PreRequestHandlerExecute(object sender, System.EventArgs e)
18: {
19: var page = ((HttpApplication)sender).Context.CurrentHandler as Page;
20:
21:
22: if (page != null)
23: page.Load += page_Load;
24: }
25:
26: void page_Load(object sender, System.EventArgs e)
27: {
28:
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:
<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.