24 messaggi dal 06 novembre 2014
Ciao a tutti, sto cercando di utilizzare Autocomplete di AjaxControlToolkit in un progetto asp.net webforms.
Ho impostato il controllo con un servizio .svc, ma non ho nessun risultato quando inserisco un testo nella textbox.
il codice del servizio .svc è
<ServiceContract(Namespace:="")>
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequire mentsMode.Allowed)>
Public Class ajaxservice
    <OperationContract()>
    Public Sub DoWork()
        ' Aggiungere l'implementazione dell'operazione qui
    End Sub

    ' Aggiungere altre operazioni qui e contrassegnarle con <OperationContract()>
    
    Public Class AutoCompleteObject
        Public Property ID As Integer
        Public Property label As String
    End Class

    <OperationContract> _
    <WebGet> _
    Public Function AutoCompleteArticle(term As String, count as integer) As List(Of AutoCompleteObject)
        Dim context As New LinqDataContext
        Dim query As List(Of AutoCompleteObject)
        query = From p In context.ViewArticle
                        Where p.article_desc.Contains(term)
                       Select p.ID, p.article_desc

        Return query.ToList
    End Function
End class


Il codice della pagina .aspx è

<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/User/UserMaster.master" CodeBehind="Test.aspx.vb" Inherits="Acom1.Test" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="OtherContent" runat="server">

            <asp:TextBox runat="server" ID="articleDesc"></asp:TextBox>
            <cc1:AutoCompleteExtender ID="AutoCompleteExtender1" runat="server" TargetControlID="articleDesc" ServiceMethod="AutoCompleteArticle" ServicePath="~/ajaxservice.svc" EnableCaching="false" FirstRowSelected="false" MinimumPrefixLength="2" CompletionSetCount="10" CompletionInterval="100"></cc1:AutoCompleteExtender>
            
</asp:Content>



Lo script manager è presente nella master page, in cui ho inserito anche
            <Services>
                <asp:ServiceReference Path="~/ajaxservice.svc" />
            </Services>


Qualcuno mi può aiutare a capire cosa sbaglio o mi sfugge?

Grazie,

Paolo
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Paolo,
può darsi che il servizio vada in errore quando viene invocato dal client. Per verificarlo, apri il pannello degli strumenti di sviluppo del browser (tasto F12) e vai nella scheda "network" o "rete".
Lì dovresti veder passare delle richieste quando digiti qualcosa nella casella. Vai ad ispezionare quelle richieste, in particolare vedi qual è stata la risposta del server. E' probabile che lì troverai degli indizi sulla causa del problema.

Ad esempio, potrebbe essere che questa assegnazione fallisca:

query = From p In context.ViewArticle
Where p.article_desc.Contains(term)
Select p.ID, p.article_desc

...perché hai dichiarato la variabile query di tipo List di AutoCompleteObject ma lì con la Select stai proiettando dei tipi anonimi. Se è questo il caso, prova con:
query = From p In context.ViewArticle
                        Where p.article_desc.Contains(term)
                       Select New AutoCompleteObject With {.ID = p.ID, .label = p.article_desc}


ciao,
Moreno
Modificato da BrightSoul il 04 novembre 2015 02.01 -

Enjoy learning and just keep making
24 messaggi dal 06 novembre 2014
Ciao Moreno, il problema sulla funzione richiamata nel servizio in realtà l'avevo già risolto, grazie comunque della dritta. Tra l'altro la funzione viene eseguita correttamente se richiamo l'url del servizio.
Provando come dici tu a controllare le richieste, purtroppo non vedo passare altre richieste dopo il caricamento della pagina digitando qualcosa nella casella di testo... L'unica anomalia durante il caricamento della pagina è che non trova una delle risorse, l'errore che riporta è

GET http://localhost:52844/Content/AjaxControlToolkit/Styles/Bundle

ma a naso credo abbia poco a che fare con il fatto che non invii le richieste al servizio.
Altro dettaglio: altri controlli del toolkit come calendar extended e combobox funzionano regolarmente.

Paolo
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Paolo,
mi serve un po' di tempo per riuscire a riprodurre il problema. A meno che tu non voglia aiutarmi fornendo un esempio base della tua applicazione, in cui sia presente giusto il servizio svc e la pagina contente la textbox e il suo autocompleteextender.

ciao,
Moreno

Enjoy learning and just keep making
24 messaggi dal 06 novembre 2014
Ciao Moreno, sarebbe fantastico, certo che vorrei aiutarti ma ti è sufficiente il codice del servizio e della pagina postato qui nel forum?
In tal caso di seguito il codice del servizio
Imports System.ServiceModel
Imports System.ServiceModel.Activation
Imports System.ServiceModel.Web
Imports Acom1.DAL
Imports Acom1.Models

<ServiceContract(Namespace:="")>
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)>
Public Class ajaxservice

    ' Per utilizzare HTTP GET, aggiungere l'attributo <WebGet()>. (ResponseFormat predefinito è WebMessageFormat.Json)
    ' Per creare un'operazione che restituisca XML,
    '     aggiungere <WebGet(ResponseFormat:=WebMessageFormat.Xml)>,
    '     e includere la riga seguente nel corpo dell'operazione:
    '         WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml"
    <OperationContract()>
    Public Sub DoWork()
        ' Aggiungere l'implementazione dell'operazione qui
    End Sub

    ' Aggiungere altre operazioni qui e contrassegnarle con <OperationContract()>
    Public Class AutoCompleteObject
        Public Property ID As Integer
        Public Property label As String
    End Class

    <OperationContract> _
    <WebGet> _
    Public Function AutoCompleteArticle(term As String, ByVal count As Integer) As List(Of AutoCompleteObject)
        Dim context As New AcomLinqContextDataContext
        Dim query As List(Of AutoCompleteObject)
        query = From p In context.ViewArticle
                        Where p.article_desc.Contains(term)
                       Select New AutoCompleteObject With {.ID = p.ID, .label = p.article_code}

        Return query.ToList
    End Function



Di seguito il codice della pagina che dovrebbe richiamare il servizio
<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/User/UserMaster.master" CodeBehind="Test.aspx.vb" Inherits="Acom1.Test" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="OtherContent" runat="server">
            <asp:TextBox runat="server" ID="articleDesc"></asp:TextBox>
            <cc1:AutoCompleteExtender ID="AutoCompleteExtender1" runat="server" TargetControlID="articleDesc" ServiceMethod="AutoCompleteArticle" ServicePath="~/ajaxservice.svc" EnableCaching="false" FirstRowSelected="false" MinimumPrefixLength="2" CompletionSetCount="10" CompletionInterval="100"></cc1:AutoCompleteExtender>
</asp:Content>


Se ti può essere utile, il codice della master page
<%@ Master Language="VB"  AutoEventWireup="false" CodeBehind="UserMaster.master.vb" Inherits="Acom1.UserMaster" %>
<%@ Import Namespace="Acom1" %>
<%@ Import Namespace="Microsoft.AspNet.Identity" %>
<!DOCTYPE html>

<html lang="it">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title><%: Page.Title %> - Acom srl</title>

    <asp:PlaceHolder runat="server">
        <%: System.Web.Optimization.Styles.Render("~/Content/AjaxControlToolkit/Styles/Bundle") %>
        <%: Scripts.Render("~/bundles/modernizr") %>
    </asp:PlaceHolder>

    <webopt:bundlereference runat="server" path="~/Content/css" />
    <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />

</head>
<body>
    <form runat="server">
        <asp:ScriptManager runat="server" EnableScriptGlobalization="true">
            <Scripts>
                <%--Per ulteriori informazioni sulla creazione di bundle di script in ScriptManager, vedere http://go.microsoft.com/fwlink/?LinkID=301884 --%>
                <%--Script framework--%>
                <asp:ScriptReference Name="MsAjaxBundle" />
                <asp:ScriptReference Name="jquery" />
                <asp:ScriptReference Name="bootstrap" />
                <asp:ScriptReference Name="respond" />
                <asp:ScriptReference Name="WebForms.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebForms.js" />
                <asp:ScriptReference Name="WebUIValidation.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebUIValidation.js" />
                <asp:ScriptReference Name="MenuStandards.js" Assembly="System.Web" Path="~/Scripts/WebForms/MenuStandards.js" />
                <asp:ScriptReference Name="GridView.js" Assembly="System.Web" Path="~/Scripts/WebForms/GridView.js" />
                <asp:ScriptReference Name="DetailsView.js" Assembly="System.Web" Path="~/Scripts/WebForms/DetailsView.js" />
                <asp:ScriptReference Name="TreeView.js" Assembly="System.Web" Path="~/Scripts/WebForms/TreeView.js" />
                <asp:ScriptReference Name="WebParts.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebParts.js" />
                <asp:ScriptReference Name="Focus.js" Assembly="System.Web" Path="~/Scripts/WebForms/Focus.js" />
                <asp:ScriptReference Name="WebFormsBundle" />
                <%--Script sito--%>
                
            </Scripts>
            <Services>
                <asp:ServiceReference Path="~/ajaxservice.svc" />
            </Services>
        </asp:ScriptManager>

<%-- Qui c'è tutto il codice del menu --%>

          <asp:ContentPlaceHolder ID="OtherContent" runat="server">
            </asp:ContentPlaceHolder> 
</form>
</body>
</html>


Fammi sapere se ti serve altro, grazie ancora per il prezioso aiuto.

Paolo
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Paolo,
partendo dal tuo codice ho messo in piedi un progetto che puoi scaricare da qui.
http://1drv.ms/1kpXzWs

Alcune considerazioni sparse:
  • La richiesta ajax parte, purché si digitino almeno 2 caratteri come indicato nella proprietà MinimumPrefixLength dell'AutoCompleteExtender
  • La richiesta era di tipo POST e si aspettava di comunicare in formato JSON, quindi ho modificato l'attributo WebGet in <WebInvoke(ResponseFormat:=WebMessageFormat.Json, RequestFormat:=WebMessageFormat.Json)>.
  • La richiesta produceva comunque un errore 415, che ho risolto inserendo questo pezzo di configurazione nel nodo <serviceHostingEnvironment>
          <serviceActivations>
            <add factory="System.ServiceModel.Activation.WebServiceHostFactory"
                 relativeAddress="./ajaxservice.svc"
                 service="TuoNamespace.ajaxservice"/>
          </serviceActivations>
    
  • Ho modificato i parametri del metodo AutoCompleteArticle. Adesso c'è un solo parametro di tipo complesso che include le proprietà count e prefixText
  • Ho modificato il tipo restituito dallo stesso metodo. Adesso è una lista di stringhe. Tu sei sicuro che si potesse usare una lista di oggetti che recano id e label? Negli esempi che ho trvato sembra che l'AutoCompleteExtender sia in grado di lavorare solo con stringhe. Puoi eventualmente postare un link all'esempio che hai trovato tu?


ciao,
Moreno

Enjoy learning and just keep making
24 messaggi dal 06 novembre 2014
Ciao Moreno, scusa se rispondo solo adesso.
Ho provato a lanciare l'applicazione di esempio che mi hai così gentilmente preparato... ma a me non funziona...
La richiesta parte correttamente alla digitazione del secondo carattere, ma non mi visualizza nessun output nella textbox.
Mi segnala un errore 404 per la risorsa

http://localhost:27987/ajaxservice.svc/jsdebug

ma niente altro.
Potrebbe essere qualche impostazione di Visual Studio o del Toolkit che sto trascurando?

Per quanto riguarda il fatto che l'AutoCompleteExtender possa usare una lista di oggetti, sono abbastanza sicuro di averlo interpretato correttamente, purtroppo non riesco più a trovare il post del forum dove l'avevo letto.
Tuttavia il tuo metodo mi sembra molto più logico ed efficace.

Grazie ancora per il prezioso aiuto.

Paolo

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.