
3.9 另一种解法:ScriptManagerProxy控件与UserControl
通过ScriptManager的Scripts来解决UserControl控件中包含JavaScript的解法虽然可行,但这并非完美解法,加载者与被加载者因为Scripts的联结而纠缠,若加载者事先无法得知被加载者需要哪些Script,那么就得一股脑将所有可能用到的Script全都设定于ScriptReference中,不管从架构还是效能来看,这都不是好现象!完美的解法应该由被加载者来绘制自己要使用的Script。幸运的,ASP.NET AJAX提供了一个ScriptManagerProxy控件,只要将其放到UserControl上,并通过其Script属性来设定要加载的.js文件即可。当UserControl被加载时,ScriptManagerProxy控件中的所有设定将会被叠加到使用此UserControl之页面中的ScriptManager控件上,也就是说ScriptManagerProxy控件的ScriptReference设定在UserControl加载时,会自动添加到使用此UserControl页面上的ScriptManager控件的ScriptReference内。以本节的例子为例,只要在UserControl中放置一个ScriptManagerProxy控件,通过其Scripts属性来添加引用JScript.js,就可从使用页面的ScriptManager内的Scripts中删除JScript.js的引用了,完全将加载那些Scripts的权利交给被加载的UserControl自行决定。同样的,如果UserControl中需要引用Web Services,而不想直接设定于使用页面上的ScriptManager控件,一样可通过ScriptManagerProxy的Services来引用Web Services。简略地说,ScriptManagerProxy控件是ScriptManager控件的一个Proxy,所有设定在其上的信息,都会在UserControl加载时被叠加到使用页面上的ScriptManager控件。