【IT168 技术文档】
ExtenderControlBase类是开发AjaxControlTookit服务器端Extender组件的基础。ExtenderControlBase基于ASP.NET AJAX的Exnteder模型提供了许多方便开发人员的强大支持,能够在它的基础上开发Extender确实是一件非常容易的事情,这样我们就可以将更多的精力放在客户端Behavior的逻辑上了,那才是AjaxControlTookit组件的重点。
当基于ExtenderControlBase开发Extender控件时,我们一般总是先为服务器端和客户端的组件同时定义好属性,然后将经历几乎完全集中在客户端Behavior的开发上。在大多数情况下,存放客户端组件代码的JavaScript文件会嵌入到程序集中,然后使用ScriptResource.axd文件发送到页面上。如果我们改变了脚本文件并且想测试修改的效果,那么我们就必须重新编译那个程序集,这样网站引用的程序集将会更新,重新刷新页面时新的脚本文件就会被发送到客户端来。
ScriptPath属性以及它的拙劣设计
很显然,我们如果仅仅为了更新脚本文件而一次又一次地编译程序集会让人觉得异常繁琐,因此出现了ScriptPath属性。ScriptPath属性被定义在ExtenderControlBase类中,它的首要作用就是为开发Extender提供便利。我们可以在开发控件时设置这个属性为某个脚本文件的相对路径,这样页面将会加载这个脚本文件而不是使用程序集中的资源,由此避免了多余的编译。
那么有了ScriptPath属性生活就真的变得美好了呢?那还得看情况。在急于作结论之前还是先看看下面的代码吧。假设我们正在开发AutoCompleteExtender,这是我们正在使用的测试页面。
<asp:TextBox runat="server" ID="myTextBox" Width="300" />
<ajaxToolkit:AutoCompleteExtender runat="server" ID="autoComplete1"
TargetControlID="myTextBox" ... />
<br />
<asp:Literal ID="Literal1" runat="server"></asp:Literal>
大部分的属性被我省略了,因为我们只关心哪些脚本文件会被发送到客户端,所以我们使用下面的代码在页面上写下一系列资源标识。
protected void Page_Load(object sender, EventArgs e)
{
List<string> identifiers = new List<string>();
IEnumerable<ScriptReference> scriptReferences =
(this.autoComplete1 as IExtenderControl).GetScriptReferences();
foreach (ScriptReference reference in scriptReferences)
{
string value = String.IsNullOrEmpty(reference.Assembly) ?
reference.Path + " (External)" : reference.Name + " (Assembly)";
if (!identifiers.Contains(value))
{
identifiers.Add(value);
}
}
StringBuilder sb = new StringBuilder();
foreach (string refer in identifiers)
{
sb.AppendLine(refer + "<br />");
}
this.Literal1.Text = sb.ToString();
}
在浏览器中打开页面,我们来看一下页面上显示了什么。
AjaxControlToolkit.Compat.Timer.Timer.js (Assembly)
AjaxControlToolkit.Common.Common.js (Assembly)
AjaxControlToolkit.Animation.Animations.js (Assembly)
AjaxControlToolkit.ExtenderBase.BaseScripts.js (Assembly)
AjaxControlToolkit.Animation.AnimationBehavior.js (Assembly)
AjaxControlToolkit.PopupExtender.PopupBehavior.js (Assembly)
AjaxControlToolkit.AutoComplete.AutoCompleteBehavior.js (Assembly)
这是页面使用AutoCompeteExtender所需资源的一个有序列表,请注意现在AutoCompleteExtender的ScriptPath为空。那么如果我们把它按照如下设置又会如何呢?
<ajaxToolkit:AutoCompleteExtender runat="server" ID="autoComplete1"
TargetControlID="myTextBox" ScriptPath="AutoCompleteBehavior.js" ... />
刷新页面之后您就会发现……
AjaxControlToolkit.ExtenderBase.BaseScripts.js (Assembly)
AutoCompleteBehavior.js (External)
嗨,我知道上一个列表中最后那个资源需要被外部文件所替换,那么其它哪些资源到哪里去了?很显然,现在结果使我们不得不自己手动地添加那些引用。ScriptPath的这个拙劣设计几乎使它成为了ExtenderControlBase中最没有用的属性了。