ASP.NET中使用泛型处理器实现移动设备自动完成功能

自动完成功能可以针对不同的数据源进行定制,只需指定源选项。数据源可以是: 一个包含本地数据的数组,可以是简单的字符串数组,也可以是包含每个数组项的对象,这些对象可以有标签或值属性,或者两者都有。标签属性将在建议菜单中显示。值将在用户从菜单中选择某项后插入输入元素。如果只指定了一个属性,它将同时用于两者,例如,如果只提供值属性,值也将用作标签。 一个字符串,指定一个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移动自动完成的数据。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485