asp.net - ¿Cómo puedo hacer que mi extensor de Autocompletar funcione?
asp.net-ajax autocompleteextender (6)
He intentado con la letra para buscar errores en mi código, pero no puedo hacer que ese extensor de autocompletar funcione. Se busca ayudante.
Aquí está mi código: (extracto de mi página aspx)
<asp:TextBox ID="TextBox1" Width="120px" runat="server"></asp:TextBox>
<cc1:AutoCompleteExtender ID="AutoCompleteExtender1" runat="server" TargetControlID="TextBox1" ServiceMethod="GetCompletionList" ServicePath="SearchAutoComplete.asmx" MinimumPrefixLength="1">
</cc1:AutoCompleteExtender>
Mi código de servicio web:
[WebMethod]
public static string[] GetCompletionList(string prefixText, int count)
{
List<string> returnData = new List<string>();
MySqlConnection con = new MySqlConnection(Connection.ConnectionString());
string sql = "select title from blog where title like ''%" + prefixText + "%''";
MySqlCommand cmd = new MySqlCommand(sql, con);
con.Open();
MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
while (reader.Read())
{
returnData.Add(reader["title"].ToString());
}
return returnData.ToArray();
}
Además de que el método GetCompletionList
está incorrectamente declarado como static
, debe tener dos atributos; [System.Web.Services.WebMethod]
y [System.Web.Script.Services.ScriptMethod]
Entonces su declaración debería verse así:
[System.Web.Services.WebMethod]
[System.Web.Script.Services.ScriptMethod]
public string[] GetCompletionList(string prefixText, int count) { ...
Además, su clase de servicio debe tener los siguientes atributos:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
El extensor de autocompletar también aparecerá roto si su método GetCompletionList
arroja una excepción. Para protegerse de esto, debe agregar un bloque try..catch
alrededor del código de la función
[System.Web.Services.WebMethod]
[System.Web.Script.Services.ScriptMethod]
public string[] GetCompletionList(string prefixText, int count)
{
List<string> returnData = new List<string>();
try
{
// database access code that sets returnData
}
catch (Exception ex)
{
// log the exception
}
return returnData.ToArray();
}
Agregue referencia a su servicio web en ScriptManager como este
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="AutoComplete.asmx" />
</Services>
</asp:ScriptManager>
consulte el enlace a continuación para obtener más información
En primer lugar, elimina "estática" de su declaración de método web. En segundo lugar, agregue EnableCaching = "true" CompletionSetCount = "20" en su
<cc1:AutoCompleteExtender
</cc1:AutoCompleteExtender>
bloque de código Espero que esto resuelva su problema.
Cuando creas un servicio web, en la parte superior hay una línea que dice:
''Para permitir que se llame a este servicio web desde una secuencia de comandos, utilizando ASP.NET AJAX, elimine el comentario de la siguiente línea.
''<System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Simplemente elimine el comentario de la línea:
<System.Web.Script.Services.ScriptService()> _
Esto me pasó en Visual Studio 2010.
Cómo solucionar este problema:
Comente su código SQL. Simplemente devuelva una matriz con algunos datos de prueba. ¿Eso funciona? ¿Lo ves? De lo contrario, no se llamará a su código de servicio web. Si eso funciona, su problema es con su código de base de datos ... ¿Su código de servicio web está en la página de llamadas?
Creo que su problema es que el método GetCompletionList
se declara static
.
Si ejecuta solo el código .asmx en una sesión de depurador (o navega hasta el archivo .asmx si ha implementado su código en un servidor web), debería ver una lista de las operaciones disponibles para el servicio web. Cuando cambio el código en los ejemplos del kit de herramientas de control Ajax para declarar este método como estático, la operación ya no está en la lista y el extensor de autocompletar también deja de funcionar.
Cambia la firma de tu método a:
public string[] GetCompletionList(string prefixText, int count)