通用自动完成 WebMethod






3.41/5 (10投票s)
用于多个 AutoComplete 扩展程序的通用自动完成 WebMethod。
引言
我们中的许多人都知道 AjaxControlToolkit 功能的强大之处,它可以帮助提高应用程序的可编程性和效率。 但是,在本文中,我尝试利用 AutoComplete extender 来创建一个通用的 WebMethod,用于检索自动完成列表。 在这里,我将展示如何利用 extender 的上下文键属性来创建一个可以与多个 AutoCompleteExtender 一起使用的方法,只需通过在运行时根据需要为每个 extender 提供特定的上下文键来区分即可。
使用代码
要运行此项目,您需要将 AjaxControlToolkit.dll 的引用添加到您的项目中,有很多教程可以指导您如何将 AjaxControlToolkit 添加到您的项目中。
假设您已经添加了引用,让我们开始编码...
步骤 1: 创建一个新的网站并向其添加一个 WebService 文件。
无需更改 asmx 文件中的任何内容,只需转到 webservice.cs 文件以及步骤 2
步骤 2: 查找并取消注释以下行
// [System.Web.Script.Services.ScriptService]
在某个地方,在其下方一定距离处,您会找到一个方法(实际上是一个 WebMethod),如下所示
[WebMethod]
public string HelloWorld() {
return "Hello World";
}
删除它 clear(或者如果您太想拥有它,可以保留它).. 并创建一个新方法,名称随意,但保持参数与下面所示的完全相同,包括字母大小写。
[WebMethod]
[System.Web.Script.Services.ScriptMethod()]
public string[] GetCompletionList(string prefixText, int count, string contextKey)
{
}
步骤 3: 这里需要一点想象力...
想象一下,在 GetCompletionList 函数中有一个字符串,其中包含您想从哪个表及其哪个列中获取完成列表的信息,格式为“tablename#columnname”。 现在假设这个字符串来自 contextKey 参数。 该字符串可用于编写一个参数化的 sql 查询,该查询为我们获取数据。
string query = "select " + contextKey.Split('#').ElementAt(1) + " from " +
contextKey.Split('#').ElementAt(0) + " where " +
contextKey.Split('#').ElementAt(1) + " like @prefixtext";
例如,如果 contextKey 值为 “tbl_Contacts#ContactName” ,而 prefixText 为 “nick”, ,则查询变为
select ContactName from tbl_Contacts where ContactName like %nick% ;
并且执行时将返回 ContactName 列下包含字符串 nick 的所有数据值
使用 SqlDataAdapter
和 SqlCommand
以及它的 CommandText
= query 填充一个 DataSet
String cnString = System.Configuration.ConfigurationManager.ConnectionStrings["cnstring"].ConnectionString;
string query = "select " + contextKey.Split('#').ElementAt(1) + " from " + contextKey.Split('#').ElementAt(0) + " where " + contextKey.Split('#').ElementAt(1) + " like @prefixtext";
SqlConnection con = new SqlConnection(cnString);
SqlCommand cmd = new SqlCommand(query, con);
cmd.Parameters.Add("@prefixtext", SqlDbType.NVarChar).Value = "%" + prefixText + "%";
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd);
try
{
da.Fill(ds, "completionListTable");
}
catch(Exception ex) { }
如果在没有异常的情况下执行 try 块后,您应该得到一个包含单列的表,该列包含所有包含 prefixText 的字符串作为行。
步骤 3: 使用 linq 或您喜欢的任何其他方式查询此表,以检索建议字符串的字符串数组并返回它..
DataTable CompletionListTable = ds.Tables["completionListTable"];
var list = from row in CompletionListTable.Select()
select row[0].ToString();
return list.ToArray();
所以我们的 WebMethod 已经完成,现在转到要使用 AutoCompleteExtender 的 aspx 页面..
步骤 4: 注册 AjaxControlToolkit 程序集..
在页面上添加一个 ToolkitScriptManager
<asp:ToolkitScriptManager ID="scriptman" runat="server"></asp:ToolkitScriptManager>
在 aspx 页面上创建两个文本框和两个对应的 AutoCompleteExtender。
<div>
<asp:ToolkitScriptManager ID="scriptman" runat="server"></asp:ToolkitScriptManager>
Categories:
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:AutoCompleteExtender ID="AutoCompleteExtender1" runat="server"
TargetControlID="TextBox1"
ServiceMethod="GetCompletionList"
ServicePath="~/WebService.asmx"
UseContextKey="true"
ContextKey=""
MinimumPrefixLength="1"></asp:AutoCompleteExtender>
Suppliers:
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
<asp:AutoCompleteExtender ID="AutoCompleteExtender2" runat="server"
TargetControlID="TextBox2"
ServiceMethod="GetCompletionList"
ServicePath="~/WebService.asmx"
UseContextKey="true"
ContextKey=""
MinimumPrefixLength="1"></asp:AutoCompleteExtender>
</div>
如您所见,两者都使用相同的 ServicePath
和 ServiceMethod
,但它们将在代码隐藏页中分配不同的 ContextKeys
,如下所示…
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
AutoCompleteExtender1.ContextKey = "Categories#CategoryName";
AutoCompleteExtender2.ContextKey = "Suppliers#ContactName";
}
}
注意:我使用了 Northwind 数据库的 Categories 和 Suppliers 表。
步骤 5:运行网站
以下是网站在上述代码运行时的屏幕截图...
像这样,您可以在整个项目中的任意数量的 AutoCompleteExtender 中使用相同的 WebMethod,而无需为每个实例编写单独的函数。