通用自动完成 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,而无需为每个实例编写单独的函数。


