begin process at 2010 02 10 07:26:19
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Web Services

 > WEBSERVICES + AJAX = UNE BONNE MÉTHODE POUR BANIR L'AUTOPOSTBACK ET AUGMENTER LA PERFORMANCE DE VOS PAGES

WEBSERVICES + AJAX = UNE BONNE MÉTHODE POUR BANIR L'AUTOPOSTBACK ET AUGMENTER LA PERFORMANCE DE VOS PAGES


 Information sur la source

Note :
5,5 / 10 - par 2 personnes
5,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Web Services Source .NET ( DotNet ) Classé sous :webservices, ajax, performance, optimisation, javascript Niveau :Expert Date de création :23/04/2009 Vu :1 746

Auteur : driver

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note


 Description

Une expérience que j'aimerais partager avec vous c'est celle de devoir supprimer un AutoPostBack sur une première DropDownList (DDL) qui fesait en sorte de remplir une autre DropDownList selon le choix de la première (il existe un lien 1 -> 0-N : c'est à dire que le faite de sélectionner une option dans le premier DDL généré 0 ou N options sur le 2eme DDL)

Source

  • /// <summary>
  • /// Description du WebService qui va récupérer les options du 2eme DDL
  • /// PS: lors de la création du webService via Visual Studio, ajouté à la main le ///[System.Web.Script.Services.ScriptService]
  • /// </summary>
  • [WebService(Namespace = "http://tempuri.org/")]
  • [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  • [System.Web.Script.Services.ScriptService]
  • public class GetDDL2Options : System.Web.Services.WebService {
  • public GetDDL2Options () {
  • //Supprimez les marques de commentaire dans la ligne suivante si vous utilisez des composants conçus
  • //InitializeComponent();
  • }
  • [WebMethod]
  • public string[] GetListOptionsDDL2(int iIDOptionDDL1)
  • {
  • //PS : le DDL1 contient des objetcs que je nommerais oDDL1Object
  • // de même le DDL 2 : oDDL2Object
  • oDDL1Object o_DDL1 = new oDDL1Object();
  • List<string> items = new List<string>();
  • o_DDL1.ID = iIDOptionDDL1;
  • //DDL2DB : classe de app_Code, qui interfere avec la Data Base afin de
  • // récupérer les objects en base de la DDL2 correspondant à un object
  • // de la DDL1 (il existe une clé étrangère)
  • ArrayList o_DDL2ObjectList = DDL2DB.GetDDL2ObjectsListForDDL2Object(o_DDL1);
  • foreach (oDDL2Object oddl2 in o_DDL2ObjectList)
  • {
  • items.Add(oddl2.ID.ToString());
  • }
  • return items.ToArray();
  • }
  • }
  • //Sur la page aspx il faut absolument insérer le ScriptManager de la façon suivante :
  • <asp:ScriptManager ID="ScriptManager1" runat="server">
  • <Services>
  • <!-- remplacez par le chemin de votre WebService -->
  • <asp:ServiceReference Path="~local/GetDDL2Options.asmx" />
  • </Services>
  • </asp:ScriptManager>
  • //à insérer dans la page concerné :
  • <script type="text/javascript" language="javascript">
  • function GetDDL2ObjectsServiceJS()
  • {
  • var webServicePath='~local/GetDDL2Options.asmx';
  • var webMethod='GetListOptionsDDL2';
  • var iId1 = $get('<%=ddl_1.ClientID %>').selectedIndex;
  • Sys.Net.WebServiceProxy.invoke(webServicePath,
  • webMethod, false,{"iIDOptionDDL1" : iId1}, OnSucceeded,
  • OnFailed,"User Context",1000000);
  • }
  • function OnSucceeded(result, eventArgs)
  • {
  • // on ajoute
  • AddItem('<%=ddl_2.ClientID%>',result,result);
  • }
  • // le web service echoue.
  • function OnFailed(error)
  • {
  • // affiche l'erreur.
  • //lbl2 erreur permet juste de visualiser l'erreur
  • var RsltElem = document.getElementById("lbl2Error");
  • RsltElem.innerHTML = "WebService Error: " + error.get_message();
  • }
  • //KD 22/04/2009 - Permet d'ajouter un element un une dropdownlist existante
  • function AddItem(DDL,Text,Value)
  • {
  • var lg = 0;
  • lg = document.getElementById(DDL).length;
  • var i=0;
  • var reg = new RegExp("[,;]+", "g");
  • var tableauDDL2 = Text.toString().split(reg);
  • //On remet a zero la taille du select puis on ajoute une option vide
  • document.getElementById(DDL).length = 0;
  • var opt = document.createElement("option");
  • document.getElementById(DDL).options.add(opt);
  • opt.text = "";
  • opt.value = "";
  • for (var j=0; j<tableauDDL2.length; j++) {
  • var opt = document.createElement("option");
  • document.getElementById(DDL).options.add(opt);
  • opt.text = tableauDDL2[j];
  • opt.value = tableauDDL2[j];
  • }
  • }
  • //Fonction récupérant la valeur de l'option du DDL2 sélectionné
  • function RecupIDDDL2() {
  • var iId2 = document.getElementById("ddl_2").value;
  • //un champ caché permet de récupérer la valeur sélectionné
  • // dans le 2eme DDL pour le récupérer lors de la validation
  • // du formulaire
  • $('hf_idDDL2').value = iId2;
  • }
  • </script>
  • //Dernière chose : entourer votre première DDL par un TD et sur son onClick appelé la //fonction JS :
  • <td onclick="GetDDL2ObjectsServiceJS();">DDL1 *
  • <asp:DropDownList ID="ddl_1" runat="server">
  • </asp:DropDownList>
  • </td>
  • //Le ddl_2, le lbl2Error et le champ caché :
  • //PS : le DropDownList est au faite un select (c'est plus adapté qu'un composant .NET)
  • <td>DDL2 *
  • <select id="ddl_Sillons" name="ddl_2" runat="server" onclick="RecupIDDDL2()">
  • </select>
  • <input type="hidden" name="hf_idDDL2" id="hf_idDDL2" runat="server" />
  • <asp:Label ID="lbl2Error" runat="server"></asp:Label>
  • </td>
/// <summary>
/// Description du WebService qui va récupérer les options du 2eme DDL
/// PS: lors de la création du webService via Visual Studio, ajouté à la main le ///[System.Web.Script.Services.ScriptService]
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class GetDDL2Options : System.Web.Services.WebService {

    public GetDDL2Options () {

        //Supprimez les marques de commentaire dans la ligne suivante si vous utilisez des composants conçus 
        //InitializeComponent(); 
    }

    [WebMethod]
    public string[] GetListOptionsDDL2(int iIDOptionDDL1)
    {             
        //PS : le DDL1 contient des objetcs que je nommerais oDDL1Object
        // de même le DDL 2 : oDDL2Object
        oDDL1Object o_DDL1 = new oDDL1Object();
        List<string> items = new List<string>();
        o_DDL1.ID = iIDOptionDDL1;
        //DDL2DB : classe de app_Code, qui interfere avec la Data Base afin de 
        // récupérer les objects en base de la DDL2 correspondant à un object
        // de la DDL1 (il existe une clé étrangère)
        ArrayList o_DDL2ObjectList = DDL2DB.GetDDL2ObjectsListForDDL2Object(o_DDL1);
        foreach (oDDL2Object oddl2 in o_DDL2ObjectList)
        {
            items.Add(oddl2.ID.ToString());
        }

        return items.ToArray();
    }
    
}

//Sur la page aspx il faut absolument insérer le ScriptManager de la façon suivante :

<asp:ScriptManager ID="ScriptManager1" runat="server">
        <Services>
            <!-- remplacez par le chemin de votre WebService -->
            <asp:ServiceReference Path="~local/GetDDL2Options.asmx" />
        </Services>
    </asp:ScriptManager> 

//à insérer dans la page concerné : 
<script type="text/javascript" language="javascript">
function GetDDL2ObjectsServiceJS()
       {
        var webServicePath='~local/GetDDL2Options.asmx';
        var webMethod='GetListOptionsDDL2';
        var iId1 = $get('<%=ddl_1.ClientID %>').selectedIndex;
        Sys.Net.WebServiceProxy.invoke(webServicePath, 
            webMethod, false,{"iIDOptionDDL1" : iId1}, OnSucceeded, 
            OnFailed,"User Context",1000000);

        }

        function OnSucceeded(result, eventArgs)
        {   
            // on ajoute                                                         
            AddItem('<%=ddl_2.ClientID%>',result,result);                                    
        }

        // le web service echoue.
        function OnFailed(error)
        {
            // affiche l'erreur.
            //lbl2 erreur permet juste de visualiser l'erreur    
            var RsltElem = document.getElementById("lbl2Error");
            RsltElem.innerHTML = "WebService Error: " + error.get_message();
        }
       
       //KD 22/04/2009 - Permet d'ajouter un element un une dropdownlist existante 
       function AddItem(DDL,Text,Value)
        {   
            var lg = 0;                                                               
            lg = document.getElementById(DDL).length;                                                                  
            var i=0;            
            var reg = new RegExp("[,;]+", "g");
            var tableauDDL2 = Text.toString().split(reg); 
            
            //On remet a zero la taille du select puis on ajoute une option vide
            document.getElementById(DDL).length = 0;
            var opt = document.createElement("option");                                                                                                        
                    document.getElementById(DDL).options.add(opt);
                    opt.text = "";
                    opt.value = "";
            
            
                                                                                                                                             
            for (var j=0; j<tableauDDL2.length; j++) {
                    var opt = document.createElement("option");                                                                                                        
                    document.getElementById(DDL).options.add(opt);
                    opt.text = tableauDDL2[j];
                    opt.value = tableauDDL2[j];                    
                                                        }                                                                                     
        }
        
        //Fonction récupérant la valeur de l'option du DDL2 sélectionné
        function RecupIDDDL2() {
           var iId2 = document.getElementById("ddl_2").value;
           //un champ caché permet de récupérer la valeur sélectionné 
           // dans le 2eme DDL pour le récupérer lors de la validation
           // du formulaire
           $('hf_idDDL2').value = iId2;
        }
</script>

//Dernière chose : entourer votre première DDL par un TD et sur son onClick appelé la //fonction  JS :
<td onclick="GetDDL2ObjectsServiceJS();">DDL1 *
                            <asp:DropDownList ID="ddl_1" runat="server">
                            </asp:DropDownList>                            
                                                                                                                                            
</td>

//Le ddl_2, le lbl2Error et le champ caché :
//PS : le DropDownList est au faite un select (c'est plus adapté qu'un composant .NET)
<td>DDL2 *
      <select id="ddl_Sillons" name="ddl_2" runat="server" onclick="RecupIDDDL2()">
      </select>                                    
      <input type="hidden" name="hf_idDDL2" id="hf_idDDL2" runat="server" />
      <asp:Label ID="lbl2Error" runat="server"></asp:Label>     
</td>

 Conclusion

Le contenu du code n'est pas une partie de plaisir mais il reste indispensable pour les alliés de la performance.


 Sources du même auteur

Source .NET (Dotnet) LINQ TO XML & LA MANIPULATION DE DONNÉES EN XML AVEC UNE APP...

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) RENDU DE TEXTE 3D GRÂCE AU WEBSERVICE XARA par ChriChri42
Source avec Zip Source .NET (Dotnet) CONVERTIR UN OBJET EN DATATABLE ET VICE-VERSA par sebmafate
Source avec Zip Source avec une capture Source .NET (Dotnet) BERREWEATHER - SERVICE WEB MÉTÉOROLOGIQUE par iuniversal
Source avec Zip Source .NET (Dotnet) UTILISATION D'UN WEBSERVICE par gcorbineau
Source avec Zip Source .NET (Dotnet) TRADUCTION AUTOMATIQUE FRANCAIS -> NÉÉRLANDAIS, ANGLAIS, ALL... par LefortLudovic

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) UTILISATION DES PERFORMANCECOUNTER par jdek
Source avec Zip Source avec une capture Source .NET (Dotnet) (COMPOSANT_WHS) WHS SHOWTIME par atomusk
Source avec Zip Source avec une capture Source .NET (Dotnet) DICTIONNAIRE OPTIMISE par aokdiallo
Source avec Zip Source .NET (Dotnet) PERFORMANCECOUNTER par yodaben
Source avec une capture Source .NET (Dotnet) INTERFACE WEB SANS WINFORMS par poppyto

Commentaires et avis

Commentaire de billou_13 le 23/04/2009 13:54:53 8/10

Merci !
Source très intéressante d'utilisation de Web Services en javascript. A user et abuser dans les développements asp.net ^^

Pour information, un tel type de besoin peut aussi conclure à une implémentation via la mise en place d'un service "AJAX-enabled WCF Services" (Framework 3.5). La technique est quasi identique.
Un très bon tutorial: http://www.pluralsight.com/community/blogs/fritz/archive/2008/01/31/50121.aspx

Commentaire de driver le 23/04/2009 14:43:47

De rien, c'est un très grand soulagement pour moi de pouvoir partager ce source avec la communauté Microsoft parce que j'ai passé beaucoup d'heures avant de pouvoir arriver à concevoir cette solution. Maintenant je sais que d'autres personne vont attrapé le HAPPY-CODING en découvrant rapidement cette solution.

Et merci pour le source en 3.5. Il me seras utile quand j'aurai à bosser sur ce framework. En ce moment je travaille sur la performance d'un site ASP.NET 2.0

Commentaire de ClaudePelletier le 10/07/2009 21:30:25

Le PostBack de la première liste déroulante s'effectue quand même. En fait, au lieu de laisser le PostBack être géré par .NET (plus sécuritaire, stable et fiable), tu as créé ta propre fonction JavaScript (GetDDL2ObjectsServiceJS) qui appelle ton service Web.

Bref, ce que tu gagnes en performance, tu le perds probablement 10 fois en sécurité, en stabilité et en fiabilité. Ce code ne résisterait pas à un audit en sécurité applicative (il est facilement injectable). C'est une belle démonstration, mais il serait téméraire d'utiliser ce petit «truc» (déjà passablement connu) dans le cadre du développement d'un site transactionnel par exemple.

Commentaire de driver le 14/07/2009 01:00:07

t'as pas tord Claude Pelletier,
mais chaque méthode dispose d'un périmètre d'utilisation, il faut juste bien définir les priorité de chaque application et les besoins de chaque client...chaque application devient unique et c'est pour ça qu'on dispose toujours de boulo dans notre domaine et heureusement d'ailleurs :)

Commentaire de ClaudePelletier le 15/07/2009 04:49:29

Cher Driver,

Je ne puis que te donner raison.  ;-)

Commentaire de lassaad83 le 11/09/2009 11:18:52 3/10

UpdatePanel ça te dit quelque chose ?

Commentaire de billou_13 le 11/09/2009 11:34:44

@LASSAAD83:

En effet, il est vrai que l'UpdatePanel comble le même besoin. Plus facile à coder, peut-être; mais permet-il d'augmenter la performance de la page ???
Je n'en suis pas si sûr...

Un simple test de cette source et d'une source équivalente avec l'UpdatePanel te permettra de remarquer que le flux réseau (avec firebug sous firefox) de rafraichissement de ta page est largement plus conséquent avec un UpdatePanel. En effet, ce dernier emporte énormément d'information avec lui qui ne sont pas toutes pertinentes.
Et je dirai même plus, si tu fais un test avec un simple postback (sans UpdatePanel) de ta page te montrera que tu n'es pas loin du flux de l'UpdatePanel.
Voici quelques liens:
- http://encosia.com/2007/07/11/why-aspnet-ajax-updatepanels-are-dangerous/
- http://msdn.microsoft.com/fr-fr/magazine/cc163413.aspx

C'est pourquoi je pense que la solution proposée par Driver fait partie des bonnes pratiques que j'essaie toujours de mettre en place dans mes projets.

Donc, OUI, je vote pour cette solution plutôt que pour un UpdatePanel (qui n'a pas de raison d'être pour ma part)...

Commentaire de driver le 11/09/2009 18:36:12

Merci Billou13 pour ta contribution critique, je te rejoint tout à fait, je n'est plus aucun commentaire à ajouter aprés une longue journée de travail. Bon week end à vous tous

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Paths et WebServices [ par jdaviaud ] J'ai un phénomène que je n'arrive pas à comprendre.j'ai un WebService qui fait une requete SELECT dans une base Access et qui m'affiche le résultat da c# et javascript [ par kach23 ] j'aimerais savoir si il est possible dans une page web d'appeler a partir d'un script c# une fonction javascript.je sais que c'esrt possible de lancer Utiliser des variables javascript dans aps.net [ par etnac ] Je m'explique un peu plus que dans le titre.J'ai dans une page une datagrid dans laquelle je gère un évènement qui me supprime la ligne selectionnée. Performance : ODBC ou OleDb [ par gog ] Bonjour à tous,J'utilise une bdd Access, quels drivers donnent les meilleurs performances ODBC ou OleDb,Merci d'avance optimisation bases de données [ par happyfish ] Je fait une appli ki transfere les données d'une base vers une autre. Je voulais savoir quel est le meilleur moyen pour les insertions/updates de la n gestion d'une liste de selection en javascript [ par cedre ] bonjour,est-il possible de supprimer un ou plusieurs éléments sélectionnés dans une liste de sélection exemple de récupération d'un élément sélectionn Webservices et SSL [ par maevacmoi ] Hello !J'ai une application cliente qui utilise des webservices. Je voudrais que les échanges entre le client et le serveur soient "sécurisés".J'ai es Javascript et ASP.NET [ par Alex009 ] BonjourJ'aimerai effectué une sommation de la valeur de deux champs(TextBox1 et TextBox2) de mon formulaire en ASP.NET, avec une fonction de JavaScrip Développer un site web en csharp ? [ par boliv ] Salut à tous,Pour des besoins professionnels, je dois m'autoformer à .Net, asp.net et c# dans le but de construire des sites. Il y a quelques années, Menu javascript et Dropdownlist [ par oulaich ] SltMon menu apprait en dessous de mes dropdownlist, y a t'il une solution pour empêcher cela?Merci.Cela m'est indéférent.


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,649 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales