(原创) 初试牛刀 - 自定义ASP.NET Ajax Extender控件

前言:
    熟悉ASP.NET Ajax的人都对AjaxControlToolkit里的Extender控件留有非常深的印象。
    有了Extender控件就可以在原有页面上指定某个服务器控件实施Ajax行为(Behavior)。
    如:常用的CalendarExtender控件。下面内容介绍怎样自定义一个Ajax Extender控件
    实现Panel服务器控件的高亮边框效果。如图所示。
    
    

正文:
    创建一个Extender控件需要完成两个部分的工作。第一,创建客户端的行为(Behavior)控件;
    第二,创建服务器端的控件。首先我们介绍一下客户端的行为控件。

    第一,创建客户端的行为控件,顾名思义就是用于响应处理客户端(Client-Side)的行为,如:鼠标指针移动
    到某个元素上(mouseover事件)或者指针移出某个元素(mouseover事件)。这些动作都交由
    客户端的Javascript代码进行响应处理。我们需要的就是编写该Behaivor响应代码,添加事件处理
    函数。这就是行为(Behavior)一词的来意。
    
    创建一个Ajax客户端的控件的步骤如下:
    1. 注册控件所属类型的名字空间。

Type.registerNamespace( " JackyZhong.Ajax.HyperLinkBorderBehavior " );

    2. 创建控件类型的构造函数,并且将作为控件的容器元素作为参数传入构造函数。
        调用initializeBase函数初始化基础类,定义私有成员或数据。

JackyZhong.Ajax.HyperLinkBorderBehavior  =   function (element) {
    
//  initialize base
    JackyZhong.Ajax.HyperLinkBorderBehavior.initializeBase( this , [element]);

    
//  private fields
     this ._borderColor  =   " #999999 " ;
    
this ._borderWeight  =   1 ;
    
    
//  event
     this ._overHandler  =   null ;
    
this ._outHandler  =   null ;
}

    3. 定义原型方法和属性。

    
    
//  mouseover event handler
    _onMouseOver:  function () {
        
this .get_element().style.border  =   this .get_BorderWeight()  +   " px solid  "   +   this .get_BorderColor();
    },
    
    
//  mouseout event handler
    _onMouseOut:  function () {
        
this .get_element().style.border  =   "" ;
    },
    
    
//   Get or Set the BorderColor property
    get_BorderColor:  function () {
        
return   this ._borderColor;
    },
    
    set_BorderColor: 
function (value) {
        
this ._borderColor  =  value;
    },
    
    
//  Get or Set the BorderWeight property
    get_BorderWeight:  function () {
        
return   this ._borderWeight;
    },
    
    set_BorderWeight: 
function (value) {
        
this ._borderWeight  =  value;
    }

    4. 重写(Override) initialize() 函数,该函数用于初始化构造函数中定义的私有成员或数据。

    initialize:  function  () {
        
//  get the parent element
         var  element  =   this .get_element();
        
        
//  initialize event handler
         this ._overHandler  =  Function.createDelegate( this this ._onMouseOver);
        $addHandler(element, 
" mouseover " this ._overHandler);
        
        
this ._outHandler  =  Function.createDelegate( this this ._onMouseOut);
        $addHandler(element, 
" mouseout " this ._outHandler);
    },

    5. 重写(Override) dispose() 函数,该函数用于释放资源。

    dispose:  function () {
        
//  nothing to do
    },

    6. 使用Type.registerClass() 函数注册控件类型和继承关系。    

JackyZhong.Ajax.HyperLinkBorderBehavior.registerClass( " JackyZhong.Ajax.HyperLinkBorderBehavior " , AjaxControlToolkit.BehaviorBase);

    至此,客户端的Behavior控件已经完成,注意:在注册控件类型时,
    我们使用AjaxControlToolkit.BahaviorBase类作为基类,因为我们定义的是Behaivor控件。 

    第二,创建服务器端的控件。创建Ajax服务器控件与创建ASP.NET服务器控件类似,也是需要继承于某个基础类。
    如:ASP.NET服务器控件通常继承于WebControl, CompositeControl等,而我们实现的Extender服务器控件
    则需要继承于 ExtenderControlBase类,Extender服务器控件的实现与.NET配置节(ConfgurationSection)或者
    配置元素(ConfigurationElement)很类似。
    
using  System;
using  System.ComponentModel;
using  System.Collections;
using  System.Collections.Generic;
using  System.Text;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.HtmlControls;
using  AjaxControlToolkit;

[assembly: WebResource(
" JackyZhong.Extenders.HyperLinkBorderBehavior.js " ,
            
" text/javascript " )]

namespace  JackyZhong.Net.Web.UI
{
    [TargetControlType(
typeof (Panel))]
    [ClientScriptResource(
" JackyZhong.Ajax.HyperLinkBorderBehavior "
            
" JackyZhong.Extenders.HyperLinkBorderBehavior.js " )]
    
public   class  HyperLinkBorderExtender : ExtenderControlBase
    {
        
#region  [ Constructor ]

        
public  HyperLinkBorderExtender()
        {
        }

        
#endregion

        [ExtenderControlProperty(
true )]
        [DefaultValue(
" #999999 " )]
        
public   string  BorderColor
        {
            
get  {  return  GetPropertyValue < string > ( " BorderColor " string .Empty); }
            
set  { SetPropertyValue < string > ( " BorderColor " , value); }
        }

        [ExtenderControlProperty(
true )]
        [DefaultValue(
1 )]
        
public   int  BorderWeight
        {
            
get  {  return  GetPropertyValue < int > ( " BorderWeight " 1 ); }
            
set  { SetPropertyValue < int > ( " BorderWeight " , value); }
        }
    }
}
    
    发现类似点了吗? 就是类的属性。.NET的配置属性使用 base[元素名称] 来获值,而继承于ExtenderControlBase
    类的属性则使用 GetPropertyValue泛型来获值。

     最后介绍怎样应用该Extender控件。
    1. 在aspx页面上添加一个Panel控件,如:
    
< asp:Panel  ID ="test"  runat ="server" > ZhongJieChao.cnblogs.com </ asp:Panel >
    
    2. 添加一个Extender控件,并使用 TargetControlID属性指定一个Panel服务器控件,
        为什么一定是Panel服务器控件? 因为Extender控件上使用了以下特性(Attribute):
         [TargetControlType(typeof(Panel))] 这样只有Panel控件才有效。

         < Jacky:HyperLinkBorderExtender  ID ="HyperLinkBorderExtender1"  runat ="server"
            BorderColor
="#6699CC"   BorderWeight ="2"  TargetControlID ="test"   />


    编译项目并执行该页面,将鼠标移动到Panel控件上就会发现Panel控件的边框随即高亮显示。
    这例子只是为了演示Extender控件的现实原理,有了这些基础后,你可以做出比CalendarExtender更炫的控件。  

    下载演示代码:Download (Fixed)

转载于:https://www.cnblogs.com/zhongjiechao/archive/2008/03/27/1124557.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值