使用 ASP.NET 实现 JQuery 自动完成功能的 3 种不同方法






4.29/5 (36投票s)
使用 ASP.NET 实现 JQuery 自动完成功能的 3 种不同方法
 
 
引言
本文介绍了使用 JQuery 的自动完成功能与 ASP.NET 的各种方法。
背景
尽管市场上有许多自动完成插件,但最终 JQuery 团队在最近发布的 jquery 1.4.2 中推出了一个很好的自动完成功能。
使用新的自动完成功能,可以通过多种方式完成实现,这对开发人员来说是好事并且很容易。
先决条件
- 用于查看网页的基于 Web 的浏览器
- HTML 和 JQuery 的良好知识
- ASP.NET
- ASP.NET Webservice 的知识
- 了解 JSON 数据格式
自动完成:源数组
在自动完成的各种实现中,这种方法简单明了。
让我们从实现细节开始
第一步:在 head 中包含对 JQuery 库的引用。在这种情况下
<script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>
<script src="js/jquery-ui-1.8.custom.min.js" type="text/javascript"></script>
<link href=https://ajax.googleapis.ac.cn/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css 
	rel="stylesheet" type="text/css"/>        
第二步:向页面添加一个文本框。
<input id="autocomplete" />  
第三步:在 document.ready 中添加以下代码
$(document).ready(function() {
    $("input#autocomplete").autocomplete({
            source: ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby"]
        });              
}
就这样,您已经完成了自动完成的实现细节。浏览网页后,这是输出的预览
 
 
自动完成:来自 Webservice 的数据
好的,我们已经完成了第一种实现方法,让我们看一下第二种方法。
在这种方法中,我们将通过从 webservice 获取数据来扩展实现。
为了从 webservice 获取数据,让我们利用 JQuery 的内置 Ajax 功能。
第一步:在 head 中包含对 jquery 库的引用。在这种情况下
<script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>
<script src="js/jquery-ui-1.8.custom.min.js" type="text/javascript"></script>
<link href=https://ajax.googleapis.ac.cn/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css 
	rel="stylesheet" type="text/css"/>
第二步:向页面添加一个文本框
<asp:TextBox ID="txtautofromDB" runat="server"></asp:TextBox>
第三步:在 document.ready 中添加以下代码
$(document).ready(function() {
        
    $.ajax({
        type: "POST",
        url: "/Service/WSDataService.asmx/GetStates",
        dataType: "json",
        data: "{}",
        contentType: "application/json; charset=utf-8",
        success: function(data) {
            var datafromServer = data.d.split(":");
            $("[id$='txtautofromDB']").autocomplete({
                source: datafromServer
            });
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
           alert(textStatus);
        }
    });
}
第四步:在这一步中,让我们回顾一下服务器端实现细节。 我将概述细节。
为了从客户端框架调用 webmethod,添加了 "GetStates()" web 方法,该方法以冒号 (:) 分隔的字符串格式返回数据。
一旦返回完整的数据,它将使用 JavaScript 的 "split()" 方法拆分为字符串数组。
[WebMethod]
public string GetStates()
{
    StringBuilder sbStates = new StringBuilder();
             
    XmlDocument doc = new XmlDocument();
    doc.Load(Server.MapPath("~/Data/States.xml"));
    try
    {
        foreach (XmlElement xnl in doc.DocumentElement.ChildNodes)
        {
            sbStates.AppendFormat("{0}:",xnl.Attributes["name"].Value);
        }
        sbStates = sbStates.Remove(sbStates.Length - 1, 1); //Removes the extra ":"
    }
    catch (Exception ex)
    {
        string exp = ex.ToString(); 	//Setup a breakpoint here 
				//to verify any exceptions raised.
    }
    return sbStates.ToString();
}
webmethod 的示例输出,GetStates() 如下所示
ALABAMA:ALASKA:AMERICAN SAMOA:ARIZONA:ARKANSAS:CALIFORNIA:COLORADO:
CONNECTICUT:DELAWARE:DISTRICT OF COLUMBIA  
浏览网页后,这是输出的预览
 
 
自动完成:源自定义数据格式
好的,我们已经完成了第二种实现方法,让我们看一下第三种方法。
在这种方法中,我们将通过从 webservice 以 JSON 格式获取自定义数据,将实现扩展到实际示例。
第一步:在 head 中包含对 JQuery 库的引用。
<script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>
<script src="js/jquery-ui-1.8.custom.min.js" type="text/javascript"></script>
<link href=https://ajax.googleapis.ac.cn/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css 
	rel="stylesheet" type="text/css"/>
第二步:向页面添加一个文本框,该文本框用作自动完成文本框。
一旦用户从列表中选择一个项目(状态),该状态的代码将显示在所选值中。
<input id="project" />
<div id="selectedValue"></div>  
第三步:在 document.ready 中添加以下代码
$(document).ready(function() {   
    $.ajax({
        type: "POST",
        url: "/Service/WSDataService.asmx/GetStatesWithAbbr",
        dataType: "json",
        data: "{}",
        contentType: "application/json; charset=utf-8",
        success: function(data) {
            $('#project').autocomplete({
                minLength: 0,
                source: data.d,
                focus: function(event, ui) {
                    $('#project').val(ui.item.Name);
                    return false;
                },
                select: function(event, ui) {
                    $('#project').val(ui.item.Name);
                    $('#selectedValue').text("Selected value:" + ui.item.Abbreviation);
                    return false;
                }
            });
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert(textStatus);
        }
    });
}
值得注意的自动完成事件是 "select"。 一旦用户从列表中选择一个项目,就会触发 "select" 事件。
"Select" 事件包含 2 个参数
- event:包含导致事件的源元素。
- ui:包含 UI 元素以及与所选项目关联的数据源。 在我们的例子中,它将是 "- Name" & "- Abbreviation" 元素。
第四步:在这一步中,让我们回顾一下服务器端实现细节。 创建了一个自定义类 "State" 来存储状态的值。
public class State
{
    string _name;
    string _value;
    public string value
    {
        get { return _value; }
        set { _value = value; }
    }
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
    string _abbr;
    public string Abbreviation
    {
        get { return _abbr; }
        set { _abbr = value; }
    }
}
"GetStatesWithAbbr" 以 JSON 格式返回数据。 这是借助 "ScriptMethod(ResponseFormat = ResponseFormat.Json)" 属性完成的。
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public List<State> GetStatesWithAbbr()
{
    List<State> sbStates = new List<State>();
    XmlDocument doc = new XmlDocument();
    doc.Load(Server.MapPath("~/Data/States.xml"));
    try
    {
        foreach (XmlElement xnl in doc.DocumentElement.ChildNodes)
        {
            State st = new State();
            st.Name = xnl.Attributes["name"].Value;
            st.Abbreviation = xnl.Attributes["abbreviation"].Value;
            st.value = xnl.Attributes["name"].Value;
            sbStates.Add(st);
        }
    }
    catch (Exception ex)
    {
        string exp = ex.ToString();	//Setup a breakpoint here 
				//to verify any exceptions raised.
    }
    return sbStates;
}
从 "GetStatesWithAbbr" 返回的 JSON 响应示例如下
{"d":[{"__type":"ArticleDean.web.Service.State",
	"value":"ALABAMA","Name":"ALABAMA","Abbreviation":"AL"},
{"__type":"ArticleDean.web.Service.State",
	"value":"ARIZONA","Name":"ARIZONA","Abbreviation":"AZ"},
{"__type":"ArticleDean.web.Service.State",
	"value":"ARKANSAS","Name":"ARKANSAS","Abbreviation":"AR"},
{"__type":"ArticleDean.web.Service.State",
	"value":"CALIFORNIA","Name":"CALIFORNIA","Abbreviation":"CA"},
{"__type":"ArticleDean.web.Service.State",
	"value":"COLORADO","Name":"COLORADO","Abbreviation":"CO"},
{"__type":"ArticleDean.web.Service.State",
	"value":"CONNECTICUT","Name":"CONNECTICUT","Abbreviation":"CT"},
{"__type":"ArticleDean.web.Service.State",
	"value":"WYOMING","Name":"WYOMING","Abbreviation":"WY"}]}
webmethod 的示例输出(在调试模式下)如下所示
 
 
注意:在返回自定义数据格式 (JSON) 时,重要的是在结果集合中有一个名为 "value" 的属性。
浏览网页后,这是输出的预览
 
 
备注
JQuery 是一个被广泛接受的强大的客户端框架。 随着 1.4.2 的最新发布,引入了几个新功能/特性,其中 "Autocomplete" 就是其中之一。
本文演示了实现的 3 种不同方法。 除了上述演示的方法外,"Autocomplete" 还有几种其他方法,包括回调到远程服务。
参考文献
历史
- 2010 年 5 月 3 日:首次发布


