[编]使用AutoCompleteExtender实现文本框自动匹配

简介: 使用AutoCompleteExtender实现文本框自动匹配 引言 Ajax Control Toolkit 是一个丰富的控件集,可以为我们提供许多很炫也很实用的页面功能。编写一个Asp.Net Ajax控件是比较耗费精力的,不仅需要有一定的javascript脚本编写能力,还需要了解微软的Ajax Library。

使用AutoCompleteExtender实现文本框自动匹配

引言

Ajax Control Toolkit 是一个丰富的控件集,可以为我们提供许多很炫也很实用的页面功能。编写一个Asp.Net Ajax控件是比较耗费精力的,不仅需要有一定的javascript脚本编写能力,还需要了解微软的Ajax Library。如果我们急需一些效果,那么可以直接使用Ajax Control Toolkit 所提供的一些功能。但是如果想要完全明白它是如何运作的,还是需要认真地学习一下如何编写一个Asp.Net Ajax控件。我个人觉得Asp.Net Ajax控件能够较好地将以前的编写的javascript特效也融合到了.Net控件中,这样既利于javascipt代码的重用,更便于日后的使用,而不是一定要在控件中使用Ajax方式与服务端进行一次通信往来。

在Ajax Control Toolkit中包含了两类控件,其中一类后缀为Extender,也就是“扩展”的意思,这类控件可以对现有Asp.Net的能力进行扩充,来实现一些更华丽的效果。这篇文章简单介绍一下Ajax Control Toolkit中的AutoCompleteExtender如何使用,顾名思义,它可以实现一个常见的效果:AutoComplete(自动匹配)。

编写WCF Service代码

在进行AutoComplete时,是将客户端文本框中输入的值与服务器端的数据相比较,这样就需要在服务端创建一个方法,它能够接受来自客户端文本框输入的字符串,并且针对此字符串对数据库或者其他数据源中的数据进行查找,然后将匹配的结果以字符串数组的形式返回给客户端,最后客户端将获得的结果以列表形式显示在输入文本框的下面。尽管前面的描述只有短短的几句话,但是却暗含了这样几个问题需要注意:

  1. 由于每次客户端输入时都要进行一个查找和匹配的过程,因此要查找的数据源如果不大的话,应该尽量缓存在服务端内存中,而不是每次查找匹配都去访问实际的存储位置,比如说数据库。
  2. 有可能用户输入的字符串会返回极大量的结果,比如30个,为了提升服务端查找的效率,也为了不在客户端显示极长的列表,可以限制返回的结果数目。
  3. AutoComplete是为了根据用户输入的字符判断用户的意图,然后返回可能的结果。如果用户只输入一个字符,比如a,就开始进行查找匹配,对于用户来说意义不大,而且也会加重服务端负担,因为此时往往会返回极长的列表。

了解了上面3个问题,我们现在在站点下创建一个Ajax-Enabled WCF Service,起名为AutoCompleteService,然后在App_Code中修改AutoCompleteService.cs:

// 上面的特性省略
public class AutoCompleteService
{
    private static string[] cityArray;  // 将数据值缓存在静态字段中

    public string[] getListFromDatabase() {
        if (cityArray != null && cityArray.Length > 0)
            return cityArray;

        // 这里通常是由数据库获取
        cityArray = new string[]{
                "Baotou",
                "Beihai",
                "Beijing",
                "Boao",
                // ...省略若干
        };

        return cityArray;
    }


    [OperationContract]
    public string[] GetCityList(string prefixText, int count) {

        string[] cityArray = getListFromDatabase();
        List<string> findCity = new List<string>(count);

        int i = 0; int j = 0;

        while (i < cityArray.Length && j < count) {
            string pre = cityArray[i].Substring(0, prefixText.Length).ToLower();

            if (pre.Equals(prefixText.ToLower())) {
                findCity.Add(cityArray[i]);
                j++;
            }
            i++;
        }

        return findCity.ToArray();
    }
}

这里我们使用一个静态字段缓存了数据源中的结果,以符合上面所说的第1条。接下来我们看一下GetCityList()方法,它接受两个参数:prefixText,代表客户端文本框中已经输入的值;而count表示返回的结果数目。第2个参数体现了我们前面所说的第2点。方法的实现没有什么好说的,无非是遍历集合,返回与prefixText相匹配的结果。这里要特别说明的是:因为这个方法要与aspx页面上的AutoCompleteExtender控件协作,所以方法的签名必须为:public string[] XXXXX(string prefixText, int count),其中XXXX代表任意合法的方法名称,但是参数的类型和名称则必须完全一致。

Web页面实现

Web页面的实现就更为简单了,因为我们使用Ajax Control Toolkit中的现成控件,所以不需要自己编码,只需要对控件的属性进行设置一下就可以了。因为我们要使用Web服务,所以需要首先在ScriptManager中对服务进行一下注册:

<asp:ScriptManager ID="ScriptManager1" runat="server">
    <Services>
        <asp:ServiceReference Path="~/AutoCompleteService.svc" />
    </Services>
</asp:ScriptManager>

接着我们在页面拖放一个Asp.Net Textbox控件,以及一个AutoCompleteExtender控件,并向下面这样对AutoCompleteExtender控件设置属性:

输入城市(拼音)
<span id="autoBox">
<asp:TextBox ID="TextBox1" runat="server" Width="160"></asp:TextBox>
</span>
<br /><br />
 
<ajaxControlToolkit:AutoCompleteExtender ID="TextBox1_AutoCompleteExtender" runat="server"
     ServicePath="AutoCompleteService.svc"
     ServiceMethod="GetCityList"
     MinimumPrefixLength="2"
     CompletionSetCount="10"
     EnableCaching="true"             
     TargetControlID="TextBox1"
     >
</ajaxControlToolkit:AutoCompleteExtender>

TextBox和通常的没有任何区别,所以我们只要看下AutoCompleteExtender就可以了。我们设置了这样几个属性:

  • TargetControlID:因为它是一个Extender扩展控件,相当于是扩展了现有控件的功能,所以这个TargetControlID说明了它要对哪个控件进行扩展,此处为TextBox1。
  • ServicePath:指明了要使用的服务,注意这里只需写名称,而无需指定全路径。
  • ServiceMethod:服务的方法名称,即是上面所指定的GetCityList。
  • MinimumPrefixLength:当文本框中输入的字符串小于这个长度时,不进行匹配,可以看到,这个可以满足我们一开始所说到的第3条。
  • CompletionSetCount:返回的最大的匹配数,也就是GetCityList的count参数的值。
  • EnableCaching:启用缓存,将之前匹配的结果缓存起来。

接下来运行页面,应该可以看到这样的结果:

总结

在这篇文章中,实现了当今Web页面中很常见的一个AutoComplete功能,我们首先分析了实现的过程中可能会存在的问题,随后借助Ajax Control Toolkit中的AutoCompleteExtender控件轻松地进行了实现。

感谢阅读,希望这篇文章能给你带来帮助!

目录
相关文章
|
3月前
|
搜索推荐 UED
敏感词 v0.19.0 新特性之敏感词单个编辑,不必重复初始化
【9月更文挑战第17天】敏感词管理在众多场景中至关重要。敏感词 v0.19.0 推出的新特性——单个编辑,无需重复初始化,显著提升了效率和灵活性,降低了系统负担。用户可直接修改特定敏感词,适用于内容审核平台、社交网络及电商平台等多种场景,确保及时响应变化,提升用户体验。这一特性为敏感词管理带来了重大改进,具有广泛的实用价值。
|
2月前
|
前端开发 JavaScript 安全
前端JS实现密码校验键盘横竖、26字母、相同字母、相同数字、密码包含用户名、数字 字母不能连续 不能相同三个、不能横向 竖向 连续三个 包含字符、不能有中文符号
该 JavaScript 代码实现了一个严格的密码校验功能,确保密码满足多种安全要求,包括长度、字符类型、不包含中文及特殊字符、不与用户名相似等。通过多个辅助函数,如 `validateFormat` 检查密码格式,`isHasChinaCharFun` 检测中文符号,`getCharAll` 生成键盘组合,以及 `checkPasswordFun` 综合验证密码的有效性和安全性。此工具对于提高用户账户的安全性非常有用。
42 0
|
C++
VS Code识别编辑规范,ESlint规则,VS Code保存去掉自动加分号、逗号、双引号
书写规范是非常重要的,除了统一,还要简洁。 1、VS Code识别编辑规范 在项目根目录新建.editorconfig文件,加入设置:
935 0
|
7月前
如何去掉字符串中文括号及其内部的内容三种方式
如何去掉字符串中文括号及其内部的内容三种方式
241 0
|
前端开发 数据库
input输入框自动消除空格
input输入框自动消除空格
106 0
|
JavaScript
jquery自动监测输入字数,自动截取,输入框
jquery自动监测输入字数,自动截取,输入框
|
数据安全/隐私保护 索引
labview字符串数据长度连接子字符串大小写替换删除插入日期匹配
labview字符串数据长度连接子字符串大小写替换删除插入日期匹配
263 0
|
小程序 JavaScript 前端开发
vba 在代码窗口里不能正常显示的双字节字符的转换
vba 在代码窗口里不能正常显示的双字节字符的转换
101 0
|
编解码
Debug栏打印时自动把Unicode编码转化成汉字
Debug栏打印时自动把Unicode编码转化成汉字
159 0
Debug栏打印时自动把Unicode编码转化成汉字
|
前端开发
解决多行文本换行省略显示失效的问题
解决多行文本换行省略显示失效的问题
479 0
解决多行文本换行省略显示失效的问题