自动完成功能可以针对不同的数据源进行定制,只需指定源选项。数据源可以是: 一个包含本地数据的数组,可以是简单的字符串数组,也可以是包含每个数组项的对象,这些对象可以有标签或值属性,或者两者都有。标签属性将在建议菜单中显示。值将在用户从菜单中选择某项后插入输入元素。如果只指定了一个属性,它将同时用于两者,例如,如果只提供值属性,值也将用作标签。 一个字符串,指定一个URL,当使用字符串时,自动完成插件期望该字符串指向一个URL资源,该资源将返回JSON数据。它可以位于同一主机上,也可以位于不同的主机上(如果不同,则必须提供JSONP)。请求参数"term"将添加到该URL。数据本身可以是与上述本地数据相同的格式。 一个回调函数,提供了最大的灵活性,可以用来将任何数据源连接到自动完成。回调接收两个参数:一个请求对象,其中包含一个称为"term"的属性,它指的是文本输入中当前的值。例如,当用户在国家字段中输入"tu"时,自动完成项将等于"tu"。一个响应回调,期望一个参数包含要向用户建议的数据。这些数据应该根据提供的项进行过滤,并且可以是上述简单本地数据的任何格式(字符串数组或具有标签/值/两者属性的对象数组)。
在提供自定义源回调时,处理请求期间的错误非常重要。即使遇到错误,也必须始终调用响应回调。这确保了小部件始终具有正确的状态。
首先,提取"SQL DB.zip"文件,并将数据库文件附加到SQL Server(jQueryMobileAutoComplete.mdf,jQueryMobileAutoComplete_log.ldf文件)或创建另一个数据库。以下是需要的SQL表脚本:
USE [jQueryMobileAutoComplete]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Countries](
[CountryID] [int] IDENTITY(1,1) NOT NULL,
[CountryName] [varchar](100) NOT NULL,
CONSTRAINT [PK_Countries] PRIMARY KEY CLUSTERED (
[CountryID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
前端代码非常轻量且简单。将新的"泛型处理器"添加到项目中,文件名为"Search.ashx"。实际上,.ashx是一个HTTP处理器;可以使用IHttpHandler创建一个处理器,在节中注册此处理器,并使用它来处理请求。
当处理器被自动完成插件请求时,它将输入的项作为"term"项放在查询字符串中。代码只需要获取它,并在SQL LIKE语句中使用它来获取匹配的结果集。然后将值转换为字符串数组,将其传递到JavaScriptSerializer以转换为JSON,然后将其作为ContentType"application/javascript"发送出去。
页面上的插件将显示选择项,用户可以选择其中一个。完成后,所选选择项将填充到<ul>元素中。
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization;
namespace jQueryMobileAutoComplete
{
public class Search : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
if (!String.IsNullOrEmpty(context.Request.QueryString["term"].ToString()))
{
string connStr = ConfigurationManager.ConnectionStrings["DBCONNSTRING"].ToString();
SqlConnection sqlconn = new SqlConnection(connStr);
SqlCommand sqlcmd = new SqlCommand();
try
{
if (sqlconn.State == ConnectionState.Closed)
{
sqlconn.Open();
}
sqlcmd.Connection = sqlconn;
sqlcmd.CommandType = CommandType.Text;
sqlcmd.CommandText = "SELECT top 10 x.CountryName as cn FROM Countries as x WHERE x.CountryName LIKE '%' + @cn + '%'";
sqlcmd.Parameters.AddWithValue("@cn", context.Request.QueryString["term"].ToString());
sqlcmd.ExecuteNonQuery();
SqlDataAdapter da = new SqlDataAdapter(sqlcmd);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
string[] items = new string[dt.Rows.Count];
int ctr = 0;
foreach (DataRow row in dt.Rows)
{
items[ctr] = (string)row["cn"];
ctr++;
}
//convert the string array to Javascript and send it out
context.Response.Write(new JavaScriptSerializer().Serialize(items));
}
if (sqlconn.State == ConnectionState.Open)
{
sqlcmd.Dispose();
sqlconn.Close();
sqlconn.Dispose();
}
}
catch (Exception)
{
throw;
}
finally
{
if (sqlconn.State == ConnectionState.Open)
{
sqlcmd.Dispose();
sqlconn.Close();
sqlconn.Close();
}
}
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
完成!运行项目:
jQuery Mobile目前还不支持多标签选择。
通过这种方式,可以在ASP.NET中使用泛型处理器(.ashx文件)搜索和选择jQuery移动自动完成的数据。