Asp.net Ajax控件之AutoComplete控件几点浅析
创始人
2024-04-21 20:01:04
0

Asp.net Ajax 1.0控件中的AjaxControlToolkit系列控件的发布给开发人员带来了很多便利,但其中很多控件似乎并没有我们想像的那么***。最近对这里面的AutoComplete控件用得较多,发现了它的几个不足或错误之处:

1.在某些情况下会出现“two components with the same id”的错误;

2.容易导致在IE中出现“无法打开Internet站点,…,已终止操作”的问题;

3.即使用户输入了很多的字符,即使已经没有相匹配的结果,它仍然会调用服务端方法,试图获取相匹配的值,白白增加了服务器的负担;

4.自动完成列表的样式不太好看;

5.服务端方法的签名必须是:string[] GetCompletionList(string prefixText, int count),无法从客户端取得其它需要的数据。这一点在一个页面中有多个需要从不同数据源获取数据的AutoComplete控件时尤其致命。

要解决这些问题,首先需要知道怎样来修改相应的代码并使之在自己的应用中生效。值得庆幸的是,Asp.net Ajax控件中AjaxControlToolkit系列控件是开源的,所以我们可以根据自己的需要来尽情修改。用VS2005打开AjaxControlToolkit解决方案,打开AutoComplete文件夹中的AutoCompleteBehavior.js文件,修改并重新编译后,将生成的AjaxControlToolkit.dll文件更新到自己的项目引用中,即可应用我们优化和增强后的Asp.net Ajax控件之AutoComplete控件了。

那么,在Asp.net Ajax控件中具体需要修改哪些代码呢?

针对***个问题,需要在AjaxControlToolkit.AutoCompleteBehavior.callBaseMethod(this, 'dispose');这一行之前加上:

  1. if (this._popupBehavior) {  
  2.     this._popupBehavior.dispose();  
  3.     this._popupBehavior = null;  

第二个问题,要将

  1. document.body.appendChild(this._completionListElement); 

这一行修改为

  1. element.parentNode.appendChild(this._completionListElement); 

第三个问题,需要在_onTimerTick方法中,为

  1. if (text.trim().length < this._minimumPrefixLength) 

这个判断增加一个条件,变成:

  1. if (text.trim().length < this._minimumPrefixLength || text.trim().length > 10)  

,这就使得,当用户的输入超过10个字符时,就不必向服务端调用读取匹配值的方法了。

第四个问题,要调整自动完成列表的样式,可以直接修改initializeCompletionList方法中的以下代码:

  1. completionListStyle.backgroundColor = this._textBackground;  
  2. completionListStyle.color = this._textColor;  
  3. completionListStyle.border = 'solid 1px buttonshadow';  
  4. completionListStyle.cursor = 'default';  
  5. completionListStyle.unselectable = 'unselectable';  
  6. completionListStyle.overflow = 'hidden'; 

,或者删除这几行,并添加:element.className = "completionList";然后在页面上添加样式类“completionList”的定义即可;

要解决***一个问题,应该在

  1. { prefixText : this._currentPrefix, count: this._completionSetCount} 

这一行中增加一个发给服务器的参数,变为:

  1. { prefixText : this._currentPrefix, count: this._completionSetCount , srcId: this.get_element().getAttribute("srcid") } 

从而,服务端的读取自动完成列表项的方法签名就可以写成:

  1. string[] GetCompletionList(string prefixText, int count ,string srcId) 

这意味着,我们可以为需要应用自动完成功能的文本框预先设置一个用于标识其数据来源的标识字符串,C#代码如:tb.Attributes.Add("srcid", "xxx"); 然后,在GetCompletionList方法中就可以根据客户端传过来的这个参数值来有针对性地读取数据了。

Asp.net Ajax控件之AutoComplete控件的一些变化就向你介绍到这里,希望对你认识Asp.net Ajax控件有所帮助。

【编辑推荐】

  1. ASP.NET笔试题之简单问答
  2. PHP与ASP.NET比较的浅析
  3. ASP.NET JSP PHP之间的取舍
  4. PHP ASP.NET的较量
  5. ASP.NET AJAX组成部分的浅析

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...