科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件ASP.NET AJAX 1.0框架之增强服务器控件的客户端功能(2)

ASP.NET AJAX 1.0框架之增强服务器控件的客户端功能(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文中,我们将探讨如何创建一个使用ASP.NET 2.0 AJAX扩展特征的ASP.NET Web服务器控件以扩展浏览器端功能。然后,我们可以使用一个客户端控件实现把这种新功能添加到客户端文档对象模型(DOM)元素中。

作者:朱先忠 来源:51CTO.com 2007年9月2日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

实现IScriptControl接口

下列是你必须在一个Web服务器控件中实现的IScriptControl接口中的成员:

①GetScriptDescriptors()

此方法返回一个ScriptDescriptor对象(此对象提供了有关与Web服务器控件一起使用的客户端组件实例的信息)集合。其中包括要创建的客户端类型,要指派的属性,以及要添加处理器的事件。

②GetScriptReferences()

此方法返回一个ScriptReference对象(此对象提供了关于与控件一起包括的客户端脚本库的信息)集合。这个客户端脚本库定义了客户端类型和相关的任何其它JavaScript代码。

本文中的Web服务器控件使用GetScriptDescriptors()方法来定义客户端控件类型的实例。该控件创建一个新的ScriptControlDescriptor对象(派生自ScriptDescriptor类的ScriptControlDescriptor子类)并且把它包括在GetScriptDescriptors()方法的返回值中。

ScriptControlDescriptor对象包括了客户端类(EnhancedTextBox)的名字和该Web服务器控件相应的ClientID值—这个值将用作生成的DOM元素的id值。该客户端类名和ClientID值将被传递给ScriptControlDescriptor对象相应的构造器。

ScriptControlDescriptor类用于设置客户端控件的属性值—这些值都来自于Web服务器控件的属性。为了定义客户端控件的属性,本文中的服务器控件使用了ScriptControlDescriptor类的AddProperty(String,Object)方法。然后,它为该客户端控件属性指定一个名和值(基于Web服务器控件相应的属性)。这里使用一个ScriptControlDescriptor对象来设置客户端控件的highlightCssClass和nohighlightCssClass属性的值。

该控件在GetScriptDescriptors()方法的返回值中提供了这个ScriptControlDescriptor对象。因此,无论何时把此Web服务器控件生成到浏览器端,ASP.NET AJAX都会相应地生成新的JavaScript—此脚本将创建一个带有所有的属性和事件处理器的客户端控件的实例。然后,根据从Web服务器控件生成的ClientID,此控件实例被依附到相应的DOM元素。下列代码展示了本文中的示例Web页面中的包括该Web服务器控件的声明性ASP.NET标记。

  ID="EnhancedTextBox 1"

HighlightCssClass="MyHighLight"

NoHighlightCssClass="MyLowLight" />

注意,该页面生成的输出包括一个对$create方法的调用。这个方法将标识出要创建的客户端类,同时还提供了与客户端控件相关联的DOM对象的客户端属性和id值。下面的代码展示了一个生成的$create方法。

$create(Samples.EnhancedTextBox ,{"highlightCssClass":"MyHighLight",

"nohighlightCssClass":"MyLowLight"}, null,null,$get('EnhancedTextBox 1'));

本文中的Web服务器控件使用GetScriptReferences()方法传递定义客户端控件类型的脚本库的位置—在这个示例中,这相应于一个指向EnhancedTextBox.js脚本文件(后面将创建)的URL。该引用是通过创建一个新的ScriptReference对象实现的,然后,把包含客户端代码的文件的路径属性设置为URL。

下列示例展示了GetScriptDescriptors()和GetScriptReferences()方法的实现。

protected virtual IEnumerable GetScriptReferences()

{

ScriptReference reference = new ScriptReference();

reference.Path = ResolveClientUrl("EnhancedTextBox .js");

return new ScriptReference[] { reference };

}

protected virtual IEnumerable GetScriptDescriptors()

{

ScriptControlDescriptor descriptor = new ScriptControlDescriptor

("Samples.EnhancedTextBox ",this.ClientID);

descriptor.AddProperty("highlightCssClass", this.HighlightCssClass);

descriptor.AddProperty("nohighlightCssClass", this.NoHighlightCssClass);

return new ScriptDescriptor[] { descriptor };

}

IEnumerable IScriptControl.GetScriptReferences()

{

return GetScriptReferences();

}

IEnumerable IScriptControl.GetScriptDescriptors()

{

return GetScriptDescriptors();

}

客户端控件的注册

必须使用当前页面中的ScriptManager对象来注册客户端控件。这是通过调用ScriptManager类的RegisterScriptControl()方法并提供一个到该客户端控件的引用实现的。

本文中的Web服务器控件使用页面中的ScriptManager控件把本身注册为一个客户端控件。为此,此控件重载了基类控件TextBox中的OnPreRender(EventArgs)方法。然后,它调用RegisterScriptControl()方法把本身注册为一个客户端控件。此外,该控件还注册了由GetScriptDescriptors()方法创建的脚本描述符—这是通过在控件的Render方法中调用RegisterScriptDescriptors()方法实现的。

下列代码展示了RegisterScriptControl()和RegisterScriptDescriptors()方法的使用(加粗部分)。

protected override void OnPreRender(EventArgs e)

{

if (!this.DesignMode)

{

//测试ScriptManager的存在;如果存在,则注册之

sm = ScriptManager.GetCurrent(Page);

if (sm == null)

throw new HttpException("当前页面中必须存在一个ScriptManager控件。");

sm.RegisterScriptControl(this);

    }

base.OnPreRender(e);

}

protected override void Render(HtmlTextWriter writer)

{

if (!this.DesignMode)

sm.RegisterScriptDescriptors(this);

    base.Render(writer);

}

关于该Web服务器控件完整的代码请参考本文相应源码文件。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章