博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
开发ASP.NET Atlas服务器端Extender控件——编写客户端Behavior
阅读量:5325 次
发布时间:2019-06-14

本文共 7784 字,大约阅读时间需要 25 分钟。

作者:Dflying Chen ( )

了解了基本概念并完成了预先需求后(请参考:),我们可以开始了开发这个ValidateUserNameExtender了。

首先,在Visual Studio中新建一个Atlas Control Project,我们给它取名为ValidateUserName。在新建以后,解决方案应该如下图所示:

extender1.JPG

可以看到,Project Template中自动为我们引用了如下程序集:

  1. Microsoft.Web.Atlas.dll,这是Atlas的核心程序集,将被下面的Microsoft.AtlasControlExtender.dll用到。
  2. Microsoft.AtlasControlExtender.dll,这是Microsoft为我们提供的Atlas中Extender的基类所在的程序集,我们自定义的Extender中的几个必须Class都继承于这个程序集中提供的基类。

同时,这个Project Template还为我们创建了一个JavaScript文件以及三个C#文件:

  1. ValidateUserNameBehavior.js,这是我们的Extender中的核心部分,也是容纳一切客户端脚本的文件,其中的内容将基本等同于中的ValidateUserNameBehavior.js文件内容,稍后会有详细分析。Atlas的Extender实际上就是对这个客户端Behavior的封装,使其成为服务器端控件,以简化网站程序开发人员在使用时的工作。而作为控件开发人员,却增加了不少工作。
  2. ValidateUserNameDesigner.cs,这里用来书写在Visual Studio中提供设计期支持的代码。
  3. ValidateUserNameExtender.cs,这里用来定义我们的Extender。
  4. ValidateUserNameProperties.cs,这里用来定义我们的Extender中所用到的属性,这些属性的值将被映射到客户端Behavior的属性上。

让我们先从ValidateUserNameBehavior.js 这个JavaScript文件开始,打开ValidateUserNameBehavior.js文件,我们会发现Template已经为我们添加了77行代码,并且在代码中有好多TODO,在代码的头部read me部分还有3个step:

  1. 创建局部变量用来存储属性值。
  2. 将这些局部变量加入到Type Descriptor中,这一步是为了让Atlas了解你的类。
  3. 为局部变量加上访问器(getter和setter)。

在开始step 1之前,我们先把Template中默认的命名空间改称我们需要的,这里我用的是Dflying.Atlas.ControlTookit.ValidateUserName,并更新所有在代码中出现的相关类名。

然后对于step 1和step 3,我们放在一起做,参考中的ValidateUserNameBehavior.js,应该加入CheckResultLabelID,ServiceName,MethodName,ValidMessage以及InvalidMessage五个属性,这里我只举出一个例子:

None.gif
var
 _MethodName;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
this
.get_MethodName 
=
 
function
() 
dot.gif
{
InBlock.gif    
return _MethodName;
ExpandedBlockEnd.gif}
ExpandedBlockStart.gifContractedBlock.gif
this
.set_MethodName 
=
 
function
(value) 
dot.gif
{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
if (_MethodName != value) dot.gif{
InBlock.gif        _MethodName 
= value;
InBlock.gif        
this.raisePropertyChanged('MethodName');
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif}

然后是step 2 :
ExpandedBlockStart.gif
ContractedBlock.gif
this
.getDescriptor 
=
 
function
() 
dot.gif
{
InBlock.gif    
var td = Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'getDescriptor');
InBlock.gif    
InBlock.gif    td.addProperty('CheckResultLabelID', String);
InBlock.gif    td.addProperty('ServiceName', String);
InBlock.gif    td.addProperty('MethodName', String);
InBlock.gif    td.addProperty('ValidMessage', String);
InBlock.gif    td.addProperty('InvalidMessage', String);
InBlock.gif           
InBlock.gif    
return td;
ExpandedBlockEnd.gif}

最后是构造函数与析够函数,同样出现在TODO 中:
ExpandedBlockStart.gif
ContractedBlock.gif
this
.initialize 
=
 
function
() 
dot.gif
{
InBlock.gif    Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(
this, 'initialize');
InBlock.gif   
InBlock.gif    _blurHandler 
= Function.createDelegate(this, blurHandler);
InBlock.gif    
this.control.element.attachEvent('onblur', _blurHandler);         
ExpandedBlockEnd.gif}
None.gif
ExpandedBlockStart.gifContractedBlock.gif
this
.dispose 
=
 
function
() 
dot.gif
{
InBlock.gif   
ExpandedSubBlockStart.gifContractedSubBlock.gif    
if (_blurHandler) dot.gif{
InBlock.gif        
this.control.element.detachEvent('onblur', _blurHandler);
InBlock.gif        _blurHandler 
= null;
ExpandedSubBlockEnd.gif    }
InBlock.gif    
InBlock.gif    Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(
this, 'dispose');
ExpandedBlockEnd.gif}

再加上调用Web Service 的Handler 以及相应的CallBack :
ExpandedBlockStart.gif
ContractedBlock.gif
this
.initialize 
=
 
function
() 
dot.gif
{
InBlock.gif    Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(
this
, 'initialize');
InBlock.gif   
InBlock.gif    _blurHandler 
=
 Function.createDelegate(
this
, blurHandler);
InBlock.gif    
this
.control.element.attachEvent('onblur', _blurHandler);         
ExpandedBlockEnd.gif}
None.gif
ExpandedBlockStart.gifContractedBlock.gif
this
.dispose 
=
 
function
() 
dot.gif
{
InBlock.gif   
ExpandedSubBlockStart.gifContractedSubBlock.gif    
if
 (_blurHandler) 
dot.gif
{
InBlock.gif        
this
.control.element.detachEvent('onblur', _blurHandler);
InBlock.gif        _blurHandler 
=
 
null
;
ExpandedSubBlockEnd.gif    }
InBlock.gif    
InBlock.gif    Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(
this
, 'dispose');
ExpandedBlockEnd.gif}

还有一部分Template 自动生成的Code ,用来连接服务器端与客户端的状态交互,在这个示例中我们不需要使用它,当然,留着也没什么坏处:
ExpandedBlockStart.gif
ContractedBlock.gif
this
.getClientState 
=
 
function
() 
dot.gif
{
InBlock.gif    
var value = Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'get_ClientState');                
InBlock.gif    
if (value == '') value = null;
InBlock.gif    
return value;
ExpandedBlockEnd.gif}
None.gif 
ExpandedBlockStart.gifContractedBlock.gif
this
.setClientState 
=
 
function
(value) 
dot.gif
{
InBlock.gif    
return Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'set_ClientState',[value]);                
ExpandedBlockEnd.gif}

最后要注意的是该JavaScript 的最后一行:
None.gif
Sys.TypeDescriptor.addType('dflying', 'ValidateUserNameBehavior', Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior);

其中dflying 代表我们的Extender 产生的客户端控件声明的前缀,ValidateUserNameBehavior 代表客户端控件的标记名称,这两个名字要取好并记牢,在接下来的CS 文件中也会用到。

这样,完整的ValidateUserNameBehavior.js源代码如下:

ContractedBlock.gif
ExpandedBlockStart.gif
ValidateUserNameBehavior.js
None.gif// (c) Copyright Microsoft Corporation.
None.gif//
 This source is subject to the Microsoft Permissive License.
None.gif//
 See http://www.microsoft.com/resources/sharedsource/licensingbasics/sharedsourcelicenses.mspx.
None.gif//
 All other rights reserved.
None.gif
None.gifType.registerNamespace('Dflying.Atlas.ControlTookit.ValidateUserName');
None.gif
ExpandedBlockStart.gifContractedBlock.gifDflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior 
= function() dot.gif{
InBlock.gif    Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.initializeBase(
this);
InBlock.gif    
InBlock.gif    
var _blurHandler;
InBlock.gif    
InBlock.gif    
var _CheckResultLabelID;
InBlock.gif    
var _checkResultLabel;
InBlock.gif    
var _ServiceName;
InBlock.gif    
var _MethodName;
InBlock.gif    
var _ValidMessage = "You can use this user name.";
InBlock.gif    
var _InvalidMessage = "This user name has already been used, please choose another.";
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.get_CheckResultLabelID = function() dot.gif{
InBlock.gif        
return _CheckResultLabelID;
ExpandedSubBlockEnd.gif    }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.set_CheckResultLabelID = function(value) dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (_CheckResultLabelID != value) dot.gif{
InBlock.gif            _checkResultLabel 
= $(value);
InBlock.gifdebug.assert(_checkResultLabel 
!= null"CheckResultLabelID must be set to a valid DOM element.");
InBlock.gif            _CheckResultLabelID 
= value;
InBlock.gif            
this.raisePropertyChanged('CheckResultLabelID');
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.get_ServiceName = function() dot.gif{
InBlock.gif        
return _ServiceName;
ExpandedSubBlockEnd.gif    }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.set_ServiceName = function(value) dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (_ServiceName != value) dot.gif{
InBlock.gif            _ServiceName 
= value;
InBlock.gif            
this.raisePropertyChanged('ServiceName');
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.get_MethodName = function() dot.gif{
InBlock.gif        
return _MethodName;
ExpandedSubBlockEnd.gif    }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.set_MethodName = function(value) dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (_MethodName != value) dot.gif{
InBlock.gif            _MethodName 
= value;
InBlock.gif            
this.raisePropertyChanged('MethodName');
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.get_ValidMessage = function() dot.gif{
InBlock.gif        
return _ValidMessage;
ExpandedSubBlockEnd.gif    }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.set_ValidMessage = function(value) dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (_ValidMessage != value) dot.gif{
InBlock.gif            _ValidMessage 
= value;
InBlock.gif            
this.raisePropertyChanged('ValidMessage');
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.get_InvalidMessage = function() dot.gif{
InBlock.gif        
return _InvalidMessage;
ExpandedSubBlockEnd.gif    }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.set_InvalidMessage = function(value) dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (_InvalidMessage != value) dot.gif{
InBlock.gif            _InvalidMessage 
= value;
InBlock.gif            
this.raisePropertyChanged('InvalidMessage');
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.initialize = function() dot.gif{
InBlock.gif        Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(
this, 'initialize');
InBlock.gif       
InBlock.gif        _blurHandler 
= Function.createDelegate(this, blurHandler);
InBlock.gif        
this.control.element.attachEvent('onblur', _blurHandler);         
ExpandedSubBlockEnd.gif    }
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.dispose = function() dot.gif{
InBlock.gif       
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (_blurHandler) dot.gif{
InBlock.gif            
this.control.element.detachEvent('onblur', _blurHandler);
InBlock.gif            _blurHandler 
= null;
ExpandedSubBlockEnd.gif        }
InBlock.gif        
InBlock.gif        Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(
this, 'dispose');
ExpandedSubBlockEnd.gif    }
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.getDescriptor = function() dot.gif{
InBlock.gif        
var td = Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'getDescriptor');
InBlock.gif        
InBlock.gif        td.addProperty('CheckResultLabelID', String);
InBlock.gif        td.addProperty('ServiceName', String);
InBlock.gif        td.addProperty('MethodName', String);
InBlock.gif        td.addProperty('ValidMessage', String);
InBlock.gif        td.addProperty('InvalidMessage', String);
InBlock.gif               
InBlock.gif        
return td;
ExpandedSubBlockEnd.gif    }
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
function blurHandler() dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (this.control.element.value == '') dot.gif{
InBlock.gif            _checkResultLabel.innerHTML 
= '';
InBlock.gif            
return;
ExpandedSubBlockEnd.gif        }
InBlock.gif        
InBlock.gif        Sys.Net.ServiceMethod.invoke(
InBlock.gif            _ServiceName, 
InBlock.gif            _MethodName, 
InBlock.gif            '',
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{ userNameCandidate : this.control.element.value},
InBlock.gif            _onMethodComplete
InBlock.gif        );
ExpandedSubBlockEnd.gif    }
InBlock.gif    
InBlock.gif    
function _onMethodComplete(result)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        _checkResultLabel.innerHTML 
= result ? _ValidMessage : _InvalidMessage;
ExpandedSubBlockEnd.gif    }
   
InBlock.gif        
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.getClientState = function() dot.gif{
InBlock.gif        
var value = Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'get_ClientState');                
InBlock.gif        
if (value == '') value = null;
InBlock.gif        
return value;
ExpandedSubBlockEnd.gif    }
InBlock.gif     
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.setClientState = function(value) dot.gif{
InBlock.gif        
return Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.callBaseMethod(this, 'set_ClientState',[value]);                
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif}
None.gif
None.gifDflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior.registerSealedClass('Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior', Microsoft.AtlasControlExtender.BehaviorBase);
None.gifSys.TypeDescriptor.addType('dflying', 'ValidateUserNameBehavior', Dflying.Atlas.ControlTookit.ValidateUserName.ValidateUserNameBehavior);

值此为止,客户端部分已经完成,接下来是服务器端,也就是还剩下的那三个CS文件的编写。

(待续……)

转载于:https://www.cnblogs.com/dflying/archive/2006/06/02/Build_Atlas_Server_Side_Extender__Client_Side_Behavior.html

你可能感兴趣的文章
巧用Win+R
查看>>
浅析原生js模仿addclass和removeclass
查看>>
Python中的greenlet包实现并发编程的入门教程
查看>>
java中遍历属性字段及值(常见方法)
查看>>
深入理解jQuery框架-框架结构
查看>>
YUI3自动加载树实现
查看>>
python知识思维导图
查看>>
当心JavaScript奇葩的逗号表达式
查看>>
App Store最新审核指南(2015年3月更新版)
查看>>
织梦MIP文章内容页图片适配百度MIP规范
查看>>
点击复制插件clipboard.js
查看>>
[Kali_BT]通过低版本SerialPort蓝牙渗透功能手机
查看>>
C语言学习总结(三) 复杂类型
查看>>
HNOI2018
查看>>
【理财】关于理财的网站
查看>>
Ubunt中文乱码
查看>>
《当幸福来敲门》读后
查看>>
【转】系统无法进入睡眠模式解决办法
查看>>
省市县,循环组装,整合大数组
查看>>
stm32中字节对齐问题(__align(n),__packed用法)
查看>>