65.9K
CodeProject 正在变化。 阅读更多。
Home

通用自动完成 WebMethod

2012 年 5 月 13 日

CPOL

3分钟阅读

viewsIcon

29169

downloadIcon

377

用于多个 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,而无需为每个实例编写单独的函数。

© . All rights reserved.