AJAX Control Toolkit自动完成扩展程序无法正常工作

时间:2011-03-06 00:33:00

标签: c# asp.net linq-to-entities ajaxcontroltoolkit autocompleteextender

我无法让AJAX CT自动完成工作。问题是当我开始在文本框中写字时没有任何反应。我遇到的第一个问题是当我尝试添加自动完成页面方法时出现错误:“无法创建页面方法”GetCompletionList“...”。然后我尝试手动创建它,但仍然没有任何反应。

这是AdministracijaOsoba.aspx代码:

<asp:TextBox ID="txtOsoba" runat="server"></asp:TextBox><asp:AutoCompleteExtender
                    ID="AutoCompleteExtender1" runat="server" ScriptPath="" 
                    ServiceMethod="GetCompletionList" ServicePath="AdministracijaOsoba.aspx.cs" 
                    TargetControlID="txtOsoba" UseContextKey="True">
                </asp:AutoCompleteExtender>

这是AdministracijaOsoba.aspx.cs代码:

public static string[] GetCompletionList(string prefixText, int count, string contextKey)
    {
        PravosudnaAkademijaEntities db = new PravosudnaAkademijaEntities();

        var osoba = from o in db.osobas
                    orderby o.osoba_prezime
                    select new { o.osoba_id, person = o.osoba_prezime + " " + o.osoba_ime };

        string[] main = new string[0];

        foreach (var o in osoba)
        {
            if (o.person.StartsWith(prefixText))
            {
                Array.Resize(ref main, main.Length + 1);
                main[main.Length - 1] = o.person.ToString();

                if (main.Length == 15)
                {
                    break;
                }
            }
        }

        Array.Sort(main);
        return main;
    }

请注意我正在使用LINQ to Entities。任何有关这方面的帮助将不胜感激。

问候!

9 个答案:

答案 0 :(得分:2)

你的代码应该是这样读的

[System.Web.Services.WebMethod]
[System.Web.Script.Services.ScriptMethod]
public static string[] GetCompletionList prefixText, int count, string contextKey)
{....}

此外,如果您使用的是pagescript方法,则无需为ajax扩展程序提供servicepath属性。

答案 1 :(得分:1)

将您的声明更改为:

<asp:AutoCompleteExtender ID="AutoCompleteExtender1" runat="server" 
    ServiceMethod="GetCompletionList" 
    ServicePath="AdministracijaOsoba.aspx/GetCompletionList" 
    TargetControlID="txtOsoba" UseContextKey="True">

将此添加到您的AdministracijaOsoba.aspx.cs代码:

[WebMethod]
public static string[] GetCompletionList(string prefixText, int count, string contextKey)
{
  ...
}

答案 2 :(得分:1)

这是我在aspx页面中的内容:

<asp:AutoCompleteExtender ID="tbSearchName_AutoCompleteExtender" runat="server" 
  DelimiterCharacters="" Enabled="True" ServicePath="" 
  TargetControlID="tbSearchName" ServiceMethod="GetCompletionList" 
  UseContextKey="True" MinimumPrefixLength="2">
</asp:AutoCompleteExtender>

在我的代码页面后面我有:

[System.Web.Services.WebMethodAttribute(), System.Web.Script.Services.ScriptMethodAttribute()]
public static string[] GetCompletionList(string prefixText, int count, string contextKey)
{
  ArrayList testList = new ArrayList();
  ...
  return (string[])testList.ToArray(typeof(string));
}

答案 3 :(得分:1)

您的代码几乎是正确的。唯一的问题是服务路径不应该以.aspx.cs结尾,而只能以.aspx结尾。如果扩展程序与方法位于同一页面上,则省略服务路径

答案 4 :(得分:1)

我也遇到过同样的问题。我知道这有点晚了,但迟到总比没有好......

以下是最终为我设置的设置(包含您的ID和名称):

Code-Behind(aspx.cs):

    [System.Web.Services.WebMethodAttribute(), System.Web.Script.Services.ScriptMethod()]
    public static string[] GetCompletionList(string prefixText, int count, string contextKey)
    {
        ...
    } 

代码(.aspx):

    <asp:TextBox ID="txtOsoba" runat="server"></asp:TextBox>
    <asp:AutoCompleteExtender ID="AutoCompleteExtender1" 
        runat="server"
        ServiceMethod="GetCompletionList"
        TargetControlID="txtOsoba"  
        UseContextKey="True">
    </asp:AutoCompleteExtender>

如您所见,您不需要设置ScriptPath和ServicePath属性,因为这些属性代表...

  

Web服务的路径   扩展器将拉出单词\句子   来自的完成。如果不是这样的话   提供,服务方法应该是   页面方法

AutoComplete Reference Page中解释。你已经在你的Code-Behind中定义了你的GetCompletionList()方法,我现在假设它被称为“页面方法”。因此,如果我们将方法放在不同的位置(例如services.cs或类似的东西),您似乎只会使用Path属性。

答案 5 :(得分:0)

删除方法声明中的static关键字。

答案 6 :(得分:0)

您可能缺少指定 AutoCompleteExtender MinimumPrefixLength 参数。

答案 7 :(得分:0)

将TextBox的自动回发属性设置为TRUE

答案 8 :(得分:-1)

Ajax自动完成使用服务调用,因此您可以在aspx.cs文件中使用以下代码,注意System.Web.Services.WebMethodAttribute()属性,这将使该方法可用于服务调用。

或者,您可以使用任何ASMX serviceWCF service进行广泛而可靠的服务使用。

[System.Web.Services.WebMethodAttribute(), System.Web.Script.Services.ScriptMethodAttribute()]
public static List<string> GetCompletionList(string prefixText, int count, string contextKey)
{
    return UserControls_phonenumbersearch.GetCompletionList(prefixText, count, contextKey);
}