Magazine

Scriptaculous , auto-remplissage & ASP.NET

Publié le 11 janvier 2007 par Olivier Duval

Scriptaculous est une librairie de composants développée à l’aide de Prototype, un framework Javascript qui facilite bien la vie du développement JS. Ces 2 librairies sont intégrées à Ruby on Rails, ce qui leur confère une pérennité assurée !

Premier test d’intégration d’un champ rempli automatiquement dans une page aspx : concluant !

L’objectif pour un projet (en ASP.NET), était de rendre plus ergonomique l’aide à la saisie concernant la sélection d’un intitulé. Pour cela, l’auto-remplissage sous forme d’un liste de choix est un bon moyen pour l’utilisateur de retrouver ce qu’il souhaite. Cette aide se déclenche au bout du 4ème caractère saisi.

J’ai utilisé Ajax.Autocompleter, méthode qui permet, de façon simple, d’appeler un script chargé de ramener une liste d’éléments, sous forme d’une liste <ul> <li>choix1</li> <li>choix2</li> </ul>

Le composant est utilisé dans une page aspx, et appelle un handler, page ayant une extension .ashx, chargée d’interroger la base de données puis de ramener les propositions.

1ère étape

Inclure les bibliothèques dans l’entête head de la page :

<head> <script type="text/javascript" src="/inc/script.aculo.us/prototype.js"</script> <script type="text/javascript" src="/inc/script.aculo.us/scriptaculous.js"</script> </head>

2ème étape

Positionner les éléments (div, controle textbox, ...) pour l’utilisation du composant :

1. <asp:textbox id=TBIntitule Runat="server" Columns="80" />
2. <span id="spinner" style="display: none"><img src="/images/spinner_orange.gif" alt="Recherche..." /></span>
3. <div id="autocomplete_choices" class="autocomplete"></div>
4. <script type="text/javascript">
   //<![CDATA[    
   new Ajax.Autocompleter("<%=TBIntitule.ClientID %>", "autocomplete_choices", 
   '<%=Page.ResolveUrl("~/Recherche/search.ashx") %>',
   {method: 'post', paramName: "searchvalue", 
   minChars: 3, indicator: 'spinner', frequency: 0.4}); 
    //]]> 
   </script>

Explications :

  1. le champ de saisie (sera transformé en <input type=text ...id='TBIntitule'/>
  2. le bloc d’affichage de l’image d’attente (spinner) lors du déclenchement de la recherche (voir d’autres exemples d’images animées utilisées pour ce type de recherche)
  3. le bloc où sera affichée la liste des propositions, sous forme <ul><li></li><li></li></ul>
  4. le code script.aculo.us qui gère la mécanique d’appel Ajax et de retour des réponses à afficher, dans l’ordre des paramètres : le (DOM) id du champ de recherche, l’id de la div d’affichage, le script de recherche (ici un handler ashx, un web service, ou un aspx reste possible), les options du composant (méthode GET ou POST, paramètre passé au script, déclenchement au bout du minChars caractère, l’id du bloc spinner, et la fréquence de déclenchement 0.4 s).

3ème étape

Ecriture du script pour notre exemple.

J’ai opté pour une solution simple : écriture d’un petit handler ashx pour répondre à la requête Ajax. L’avantage de ce type de script est qu’il est simple à mettre en oeuvre, et surtout peu coûteux en ressources (vs. un aspx ou un web service SOAP).

Source de la page search.ashx en C# :

public class search : IHttpHandler, System.Web.SessionState.IRequiresSessionState  
{  
    private string _search(string strSearch) 
    {     
       IClassificationManager mgr = ClassificationMgr;  
       IIntitulePoste[] intitules = mgr.GetIntitulesPostesByString(strSearch, 4);   
       StringBuilder myreponse = new StringBuilder(); 

       myreponse.Append("<ul>");  

       for (int i = 0; i < intitules.Length; i++)    
         myreponse.AppendFormat("<li>{0}</li>", ((IIntitulePoste)intitules[i]).Libelle); 

       myreponse.Append("</ul>");  

       return myreponse.ToString();  
    }  

    public new void ProcessRequest(HttpContext context) 
    {
      string strSearch = context.Request.Form["searchvalue"];  

      if (! String.IsNullOrEmpty(strSearch) )
         context.Response.Write(_search(strSearch));  
      else  
         context.Response.Write("<ul></ul>"); 
    }

    public new bool IsReusable 
    { 
      get { return true; } 
    }
}  

System.Web.SessionState.IRequiresSessionState : si la classe implémente cette interface alors une ouverture de session sera demandée, dans le cas d’un intranet/extranet, évite que le .ashx soit public (dans le cas où une session est soumise à une authentification).

4ème étape : affinage des résultats avec du style

Le résultat étant formé de <ul><li></li></ul>, il faut y appliquer un style afin de rendre plus utilisable la liste (sans les points . , mettre une couleur sur le choix courant, ...). Le résultat est rendu dans <div id="autocomplete_choices" class="autocomplete"/>, appliquons un style à cette class :


div.autocomplete { position:absolute; width: 200px; background-color:white; border:1px solid #888; margin:0px; padding:0px; z-index: 1000 } 
div.autocomplete ul { list-style-type:none; margin:0px; padding:0px; } 
div.autocomplete ul li.selected { background-color: #ffb;}  
div.autocomplete ul li { list-style-type:none; display:block; margin:0; cursor:pointer; }

Ce premier exemple, permet de voir très rapidement l’avantage et l’apport d’Ajax dans le Web 2.0, pour un meilleur service à l’utilisateur !

A vos claviers !

Scriptaculous auto-remplissage & ASP.NET

Retour à La Une de Logo Paperblog

LES COMMENTAIRES (1)

Par Thomas VOD et visioconférence
posté le 09 janvier à 20:56
Signaler un abus

J'ai un problème avec l'élément qui reçoit les résultats. En effet son CSS initial est display:none et n'est pas mis à jour, donc les résultats sont présents mais invisibles. Comment faire?

A propos de l’auteur


Olivier Duval 4 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Dossier Paperblog