AjaxControlToolkit 的 `AutoCompleteExtender` 需要 Web Service,但可直接在頁面代碼後置 (`.aspx.cs`) 定義 `[WebMethod]` 靜態方法作為資料來源,省去建立 `.asmx`/`.svc` 的麻煩。
CREATE PROCEDURE usp_ActiveDirectoryInfo_GetDisplayNameForService
@PrefixText NVARCHAR(MAX), @Count INT
AS
BEGIN
DECLARE @W NVARCHAR(MAX) = @PrefixText + '%';
EXECUTE('SELECT TOP (' + CAST(@Count AS VARCHAR) + ') [displayName]
FROM [dbo].[ActiveDirectoryInfo] WHERE [displayName] LIKE ''' + @W + '''');
END
public class ActiveDirectoryInfo
{
private BusinessBase _biz = new BusinessBase();
public DataTable GetDisplayName(string prefixText, int count)
{
var paras = new[] {
new Parameter("@PrefixText", SqlDbType.NVarChar, -1, prefixText),
new Parameter("@Count", SqlDbType.Int, 4, count)
};
return _biz.GetDataToDataSet("usp_ActiveDirectoryInfo_GetDisplayNameForService", paras).Tables[0];
}
}
[System.Web.Services.WebMethod]
[System.Web.Script.Services.ScriptMethod]
public static string[] GetCompletionList(string prefixText, int count, string contextKey)
{
var adi = new ActiveDirectoryInfo();
var dt = adi.GetDisplayName(prefixText, count);
return dt.AsEnumerable().Select(r => r["displayName"].ToString()).ToArray();
}
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
<!-- 或 ToolkitScriptManager -->
<asp:TextBox ID="txtReceiver" runat="server" />
<ajaxToolkit:AutoCompleteExtender
ID="aceReceiver" runat="server"
TargetControlID="txtReceiver"
ServiceMethod="GetCompletionList"
ServicePath=""
MinimumPrefixLength="2"
CompletionInterval="100"
CompletionSetCount="10"
DelimiterCharacters=";,"
ShowOnlyCurrentWordInCompletionList="true" />
| 項目 | 設定 |
|---|---|
| ServicePath | 空字串 → 當前頁面 |
| ServiceMethod | 頁面靜態 WebMethod 名稱 |
| ScriptManager | EnablePageMethods="true" |
| WebMethod 簽章 | `static string[] Method(string prefixText, int count, string contextKey)` |