写在前面的话:

       本人在前一段的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