Mi sono trovato a sviluppare un sacco di Custom Control nella mia "carriera".
In molti casi mi sono "scontrato" con la scarsa conoscenza del team in questo campo. E' una cosa abbastanza strana, capire che un Custom Control non è niente di trascendentale e che quello che fa il framework con la sua Textbox volendo possiamo rifarlo anche noi è una cosa che tutti gli sviluppatori dovrebbero _quantomeno_ comprendere... non dico saperla fare ad occhi chiusi, ma comprenderla si :)
Comunque, a parte le filippiche, le domande che piu mi sento fare è come utilizzare dei path relativi. Ho visto brutture (roba tipo passare c:\inetpub\temp in una proprietà del custom control) causate dal fatto che non si sapeva come altro fare...
Prima di tutto, sappiate che ogni controllo può usare i path preceduti da "~\" per indicare la root dell'applicazione. Il metodo che si occupa di "tradurre" la tilde è ResolveClientUrl() dell'oggetto Control.
Questo metodo è accessibile da qualsi oggetto che erediti da control, quindi anche CompositeControl o WebControl. Insomma, da ogni nostro custom control :)
Il problema può essere: come fare nel caso nel mio progetto Custom Control ci siano alcune "classi helper" che si occupano di gestire il path in vece del mio Custom Control e che, ovviamente, non ereditano da Control?
In questo caso non ho ResolveClientUrl subito disponibile, ma partendo dal presupposto che la classe helper verrà usata da un Custom Control il quale, ovviamente, sarà ospitato in una pagina web, posso utilizzare l'HttpContext per arrivare alla pagina chiamante e, quindi, avere un'istanza dell'oggetto Page corrente che mi possa risolvere la tilde. La sintassi è:
Page currentPage = (Page)HttpContext.Current.Handler;
In questo modo potrò poi chiamare currentPage.ResolveClientUrl(urlConLaTilde) senza probilemi!
P.S.: DEVO iniziare a vedere qualcuno di quegli aggeggi per scrivere codice sul blog :D