AjaxControlToolkit ClientSide vs ScriptReferences
Cristian Merighi ()

Come essere sicuri di referenziare tutte le librerie necessarie all'utilizzo meramente client (javascript) del toolkit?
Questo articolo è da considerarsi obsoleto. Alcune funzionalità potrebbero non essere più disponibili e non è possibile aggiungere commenti.
Vi siete già trovati davanti alla necessità di dover utilizzare i controlli
dell'AjaxControlToolkit (o vostri componenti implementati su tale framework Ajax) in maniera puramente client (direttamente via javascript)?
Sarete sicuramente ricorsi alla seguente - errata - maniera di incapsulare nello ScriptManager(Proxy)
le necessarie ScriptReferences.
WRONG WAY:
<asp:ScriptManager runat="server" ID="sm">
<Scripts>
<asp:ScriptReference Assembly="AjaxControlToolkit"
Name="AjaxControlToolkit.Compat.Timer.Timer.js" />
<asp:ScriptReference Assembly="AjaxControlToolkit"
Name="AjaxControlToolkit.CollapsiblePanel.CollapsiblePanelBehavior.js" />
</Scripts>
</asp:ScriptManager>
Tale strada è sbagliata e lo è per un paio di motivi.
Diamo un'occhiata agli attributi che decorano la classe AjaxControlToolkit.CollapsiblePanelExtender:
[Designer("AjaxControlToolkit.CollapsiblePanelDesigner, AjaxControlToolkit")]
[ClientScriptResource("AjaxControlToolkit.CollapsiblePanelBehavior", "AjaxControlToolkit.CollapsiblePanel.CollapsiblePanelBehavior.js")]
[RequiredScript(typeof(CommonToolkitScripts))]
[RequiredScript(typeof(AnimationScripts))]
[TargetControlType(typeof(Panel))]
[DefaultProperty("CollapseControlID")]
[System.Drawing.ToolboxBitmap(typeof(CollapsiblePanelExtender), "CollapsiblePanel.CollapsiblePanel.ico")]
public class CollapsiblePanelExtender : ExtenderControlBase
- Come potete intuire, affinché il componente client AjaxControlToolkit.CollapsiblePanelBehavior possa girare, non basta referenziare
il solo file AjaxControlToolkit.CollapsiblePanel.CollapsiblePanelBehavior.js (incapsulato nell'assembly AjaxControlToolkit),
ma anche un altro paio di librerie condivise (evidenziate sopra)!
- In seconda battuta ci accorgerèmmo di come - qualora volessimo come nel nostro caso istanziare oggetti di tipo Sys.Timer -
la libreria di riferimento per il Timer è anche alla base degli scripts di Animation (evidenziati).
Ci stiamo ponendo quindi nella scomoda situazione di dover conoscere a fondo informazioni delle quali non dovrebbe importarci nulla!
Ecco perché esiste una corretta maniera per ottenere ciò che stiamo cercando...
RIGHT WAY:
var scriptRefs =
AjaxControlToolkit.ScriptObjectBuilder.GetScriptReferences(typeof(AjaxControlToolkit.TimerScript))
.Union(AjaxControlToolkit.ScriptObjectBuilder.GetScriptReferences(typeof(AjaxControlToolkit.CollapsiblePanelExtender)))
.ToList();
scriptRefs.ForEach(sr => ScriptManager1.Scripts.Add(sr));
Spero sia d'aiuto.
Take care. Bye.