写在前面的话:

本人在前一段的ASP.NET AJAX的学习中,本想使用一个<ajaxToolkit:ValidatorCalloutExtender >,但是折腾了几天,发现不能够使用,当然原因很多.

我最需要的一个功能是使用异步WEBSERVICE来检验一个输入的内容在数据库中,是否已经存在.就是这么一个功能使我使用<ajaxToolkit:ValidatorCalloutExtender >的努力宣告失败.

因为ASP.NET的服务器端验证控件,无法在WEBSERVICE回调函数中完成置标工作,也就是设置控件校验属性为false,所以也就完成不了相应的其他的提示工作了.

唉,没办法,放弃使用吧,可是心有不甘.怎么办呢,自己写一个,当然是参考<ajaxToolkit:ValidatorCalloutExtender>(其时是照抄).到处找资料,网上还没有这方面的现成的资料.

只能从头开始看Ajax Control ToolKit的Sample,其中有一段正和我用.考虑到网上这方面的资料比较少,共享出来,也让大家有个拍砖头的地方.

本人的英文水平可以用一个字和几个字来形容,一个字是"烂",几个字是"非常非常烂烂哪".整篇文章都是用金山快译的全文翻译和金山词霸一点一点看明白的.唉,英文不好就是吃亏呀.

所以下面的东西只能博行家一笑,请各位前辈和达人指教,及斧正.更加欢迎各位ASP.NET AJAX的同学们来拍砖,拍的砖头越多越好,不要怕我疼!!!(嘻嘻,咬着后槽牙说得.^_^)

废话不说了,下面是正文:

创建一个新的extender

下述的步骤将帮助你们从头创建一个新的ASP.NET AJAX Extender.当你完成这些工作时,你将会写一个新的并且能够自己定制的Extender.而且它能够在你其他的ASP.NET网页中工作.

首先必须要有的环境

vs.net2005,ASP.NET AJAX, ASP.net Ajax Ctp, AjaxControl ToolKit,有关相关软件的下载,安装和其他事项,请您参阅其他的文章.在此就不一一的提供了.

创建基础的框架

使用Visual Studio 2005, 打开"文件"菜单从ASP.NET AJAX web站点模版中创建一个新的web站点.

点击"新建", "网站...",并在"模版"中选择"ASP.NET AJAX Enabled Web Site"。如果您准备使用除了Timer,ScriptManager,ScriptManagerProxy,UpdataPanel以外的更多的ASP.NET AJAX功能,请选择“ASP.NET AJAX CTP-Enabled Web Site”.如果您想使用AjaxControlToolkit当中的功能, 请选择AJAX Control Toolkit Web Site。

打开"文件"菜单,从菜单当中点击"添加",和"新建项目...",您可以选择使用C#语言或VB语言以及从"模版"项中选择"ASP.NET AJAX Control Project"项目. 新项目的名称是DisableButton.

Visual Studio 2005将创建你的项目模版.并且自动创建4个文件:

DisableButtonBehavior.js - 你将会在这个文件里加入你全部的客户端javascript脚本.

DisableButtonExtender.cs - 这是服务器端控制类它将管理你创建的Extender和允许你在设计时设置属性. 它也使你能在你的Extender中设置和定义属性. 这些属性可以被别的代码以及在设计时以及DisableButtonBehavior.js文件中定义的相匹配的属性所访问到的.

DisableButtonDesigner.cs - 这个类实现设计功能.你不应该修改它.

首先我们先需要测试一下这个框架能否正常工作,并且确定客户端行为是适当的被设置成我们需要的模式:

通过双击DisableButtonBehavior.js来打开它,在//TODO下面加入测试代码:

alert("Hello World!");

输入的测试代码应该在下面一行代码的上面:

this._myPropertyValue = null;

现在我们通过在解决方案资源管理器中双击Default.aspx来打开它.首先点击设计页来切换到设计视图,从工具箱中拖拽加入一个TextBox(TextBox1),再从工具箱中拖拽加入一个Button(Button1),然后点击菜单中的"生成"和选择"生成解决方案".

等到生成完毕之后在工具箱的顶部,你将会找到一个标签"DisableButton Components".内部是一个叫"DisableButtonExtender"的项目,拖拽这个到你的Aspx页面上. 如果你在工具箱中没有找到这个工具箱项目,你可以通过以下的步骤手工添加这个项目:

切换到源代码视图,用鼠标右键击击web站点,来加入对程序集合的引用,选择"添加引用...", "项目", 和"DisableButton"

在页面顶部加入下列代码来在你的页面当中注册引用:

<%@ Register Assembly="DisableButton" Namespace="DisableButton" TagPrefix="cc1"%>

Note(注释): 如果你使用Visual Basic,命名空间将是"DisableButton.DisableButton"

在你的Aspx页面中手工加入这个控件:

<cc1:DisableButtonExtender ID="DisableButtonExtender1" runat="server"/>

你现在可以切换回设计视图,点击选中DisableButtonExtender,在属性面板中扩展TargetControlID属性,选择"TextBox1",按下F5键运行这个Aspx页面(如果VS.net2005弹出对话框提示"未启用调试"则允许调试),我们应该检验页面加载时是否停下来显示"Hello World!"对话框.

检验成功后,关闭浏览器窗口.我们进行下一步的工作.

添加新的功能(我们自己的功能)

删除我们先前添加到DisableButtonBehavior.js文件中的测试代码:

alert("Hello World!");

在DisableButtonExtender.cs文件中限制TargetControlType的类型只能是TextBox文本框:

[TargetControlType(typeof(TextBox))]

在下面的步骤中我们来创建一个更好的属性名称(重要的步骤):

在DisableButtonExtender.cs文件中将"MyProperty"修改为"TargetButtonID",共有3处。

在DisableButtonBehavior.js文件中将"MyProperty"/"myProperty"修改为"TargetButtonID",共有5处。

按照我们修正的TargetButtonID属性的例子,我们现在来增加新的DisabledText属性(重要的步骤)

在DisableButtonExtender.cs文件中加入一个新的public string属性:

[ExtenderControlProperty]

public string DisabledText

{

get

{

return GetPropertyStringValue("DisabledText");

}

set

{

SetPropertyStringValue("DisabledText", value);

}

}

在DisableButtonBehavior.js文件中已有的成员变量下面,为客户端的行为加入一个新的成员变量:

this._DisabledTextValue = null;

在DisableButtonBehavior.js文件中"//TODO"的下面,现有的get/set方法上面,添加TargetButtonID属性的get/set方法:

get_DisabledText : function()

{

return this._DisabledTextValue;

},

set_DisabledText : function(value)

{

this._DisabledTextValue = value;

},

因为TargetButtonID最终总是要提交给一个控件来进行控制,所以我们在DisableButtonExtender.cs文件中把下面的属性添加到TargetButtonID的特性中.这样.NET framework将会在运行时自动提供控件的ID.

[IDReferenceProperty(typeof(Button))]

在DisableButtonBehavior.js文件中已经存在的范型定义中,使用下列的代码为客户端的行为加入keyup处理函数:

_onkeyup : function()

{
        var e = $get(this._TargetButtonIDValue);

if (e)

{

var disabled = ("" == this.get_element().value);

e.disabled = disabled;

if (this._DisabledTextValue)

{

if (disabled)

{

this._oldValue = e.value;

e.value = this._DisabledTextValue;

}

else

{

if (this._oldValue)

{

e.value = this._oldValue;

}

}

}
     }
},

使用下列的代码将keyup处理函数添加到initialize函数中:

$addHandler(this.get_element(), 'keyup',Function.createDelegate(this, this._onkeyup));
this._onkeyup();

在解决方案资源管理器中使用双击来切换回Default.aspx,通过点击源代码页来切换到源代码视图,通过从DisableButtonExtender.cs文件中删除下述的代码来删除旧的属性:

MyProperty="property"

重新编译我们的解决方案,通过点击设计页来切换到设计视图,通过点击TextBox来修改extender的特性,去到属性面板,扩张DisableButtonExtender项目,将TargetButtonID属性指定为"Button1"以及将DisabledText的值输入:"Enter text".

现在我们可以通过按下F5键来运行这个Aspx页面,在文本框中输入文本,并且注意观察按钮控件的行为-您应该注意它一开始时是被禁用的,并且当文本框的输入内容为空时显示“Enter text”.一旦您在文本框之中输入了文本内容,按钮控件将可以使用,并且按钮将显示为"Button".

祝贺您,您已经完成了您的第一个ASP.NET AJAX extender了!!!

写在最后的废话:

我准备在这个框架的基础上,完成客户端控件校验的功能,具体的还没想好,各位谁有更好的想法,请您千万要不吝赐教.

ps:

我这篇随笔使用Windows Live Write写的,有人知道更好用的客户端软件吗,能麻烦您告诉我吗?谢谢诶!!!

转载于:https://www.cnblogs.com/panda/archive/2006/11/06/551899.html

创建一个新的extender相关推荐

  1. 01_创建一个新的activityactivity配置清单文件

    今天开始学四大组件.今天是学Activity,然后是广播接收者,然后是服务,然后是内容提供者.四大组件,咱们一天一个.Activity就是跟用户交互的界面,大部分的应用都不会只有这么一个界面.创建多个 ...

  2. python生成一个窗口_PyQt5创建一个新窗口的实例

    更多python教程请到友情连接: 菜鸟教程www.piaodoo.com 人人影视www.sfkyty.com 飞卢小说网www.591319.com 韩剧网www.op-kg.com 兴化论坛ww ...

  3. docker commit (从容器创建一个新的镜像)

    从容器创建一个新的镜像 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] -a :提交的镜像作者:-c :使用Dockerfile指令来创建镜像 ...

  4. 如何在Java中创建一个新的List

    本文翻译自:How to make a new List in Java We create a Set as: 我们创建一个Set为: Set myset = new HashSet() How d ...

  5. 关卡设计快速入门_3. 创建一个新关卡

    接下来,创建一个新关卡,来构建您的游戏环境.当创建一个新关卡时,就和您创建一个新项目类似.虚幻引擎允许您选择 模板 .默认情况下,有一个 默认 模板(它具有非常简单的场景) 和一个 Empty Lev ...

  6. C语言socket accept()函数(提取出所监听套接字的等待连接队列中第一个连接请求,创建一个新的套接字,并返回指向该套接字的文件描述符)

    文章目录 名称 使用格式 功能参数描述 参数 sockfd addr addrlen 返回值 示例 man 2 文档中的accept解释 错误处理 名称 accept() 接收一个套接字中已建立的连接 ...

  7. IDEA中添加tomcat服务器和创建一个新的web项目

    1.tomcat服务器的配置 第一步: 第二步:找到Templates 第三步: 第四步: 第五步: 第六步: 这样就完成了 2.创建一个新的web项目 第一步: 第二步: 第三步 第四步:

  8. 如何通过 Impex 在 SAP Commerce Cloud 创建一个新的 Component

    使用下面的 impex 创建一个新的 Component: $contentCatalog=electronics-spaContentCatalog $onlineContentCV=catalog ...

  9. python如何创建问答窗口_在tkin中创建一个新的单独窗口

    我想创建一个新的单独窗口,比如在记事本中打开一个新页面.在 我写的是:import tinter from tkinter import Tk, Frame, Menu class Example(F ...

最新文章

  1. Java -- JDBC 学习--批量处理
  2. 关于Presenting view controllers on detached view ...
  3. 伯克利人工智能研究院最新研究:协作型工业机器人如何更智能?
  4. 全家竟然都迷陕西卫视的《关东男人》
  5. 【翻译】eXpressAppFramework QuickStart 业务模型设计(十)——在代码中实现数据验证...
  6. 谷歌浏览器javascript调试教程
  7. x60 深度linux,vivo X60 系列将全球首发 OriginOS 交互体验脱胎换骨
  8. C#异常Retry通用类
  9. 我心目中的Asp.net核心对象
  10. Struts2 多方法的Action
  11. java zip4j 内存文件和磁盘文件 压缩和加密
  12. Android之反编译
  13. jsdroid 教程_安卓10 ROM编译教程(六):清除编译与更新源码
  14. 微信好友只有昵称没有微信号_为什么有些好友名片有显示微信号,有些却没有,怎么回事?急...
  15. 22. 协程与Python中的多任务异步协程
  16. 什么是软文?什么是软文广告?
  17. 单片机读取多路温度c语言,以51单片机为内核实现了两路温度采集与显示的温度控制器设计...
  18. 冷月手撕408之操作系统(5)-进程概述
  19. 最重要的会计期间是_数据备份应该在每个会计期间完成( )后进行
  20. 软考高级-系统架构师-第四章系统开发基础知识

热门文章

  1. 用@Scheduled完成定时任务
  2. 我的世界服务器显示outofmemory,游戏中out of memory解决办法分享
  3. html5 新标签xss,HTML5 localStorageXSS漏洞
  4. Qt Creator 配置Msvc 2012的调试器
  5. 用卷积神经网络识别实际田间条件下茶叶病虫害(自然环境下拍摄的数据集不用太多预处理)
  6. keytool条目_keytool工具使用详解二(整理)
  7. matlab神经网络(二)-bp神经网络,MATLAB神经网络(2) BP神经网络的非线性系统建模——非线性函数拟合...
  8. 安卓10省电还是费电_拍照成罪魁祸首 安卓十大耗电App排行公布
  9. mysql-5.7.16-winx64+Navicat安装及配置
  10. 数据结构排序系列详解之二 希尔排序