IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

web.sitemap a partir d'une table


Sujet :

ASP.NET

  1. #1
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut web.sitemap a partir d'une table
    Bonjour, je veux mettre un menu treeview dans ma page web et que le fichier web.sitemap soit généré a partir d'une table, comment puis je faire ?

  2. #2
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Bonjour,

    Je ne sais pas s'il existe déjà un classe toute faite permettant cela. Par défaut on utilise généralement le XmlSiteMapProvider pour alimenter la SiteMapDataSource.

    Toujours est-il que tu peux créer ton propre provider en héritant de StaticSiteMapProvider. Tu as un exemple pour Access sur cette page MSDN.

    En espérant t'avoir aidé.

  3. #3
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut
    j'ai trouvé un autre exemple :

    mais je sais pas comment traduire ca en c# ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    'à partir du PageLoad il faut remplir le ou les premiers noueds du TreeView avec  ce code qui peut trés bien être dans une Sub déportée
    Dim dt As DataTable = dm.ExecuterRequeteSimple("SELECT Identifiant, Libelle FROM lobdjetBDD WHERE Parent is null ORDER BY Parent")
    'le ORDER c'est à vous de voir, ça peut être un autre champ qui serait ajouter en bout de ligne.
    'la clause WHERE sert à déterminer le ou les noeuds de plus haut niveau, j'ai mis du NULL, j'aurais pu mettre un autre identifiant, 0 par exemple.
    'Le chargement dans une DataTable est ce que j'ai trouvé de plus simple car j'ai un FrameWork perso qui me renvoi une DataTable en deux lignes de code 
    	For Each dr As DataRow In dt.Rows
    		Dim NewNode As New TreeNode(dr(1), dr(0))
    'là, on emploi les index de champs, histoire que ce soit plus facile, donc l'ordre des champs....
    		NewNode.PopulateOnDemand = True
    		NewNode.Expanded = False
    		NewNode.SelectAction = TreeNodeSelectAction.None
    'c'est trois lignes là sont là pour l'exemple, parce que mon besoin à l'origine est comme ça, mais c'est là qu'on bricole le noeud pour lui donner l'apprence et les fonctions que l'on souhaite. Un With est certainemnt sympa.
    		TV.Nodes.Add(NewNode)
    	Next
     
    'ensuite on active le PopulateOnDemand du TreeView pour remplir à la suite à chaque fois qu'un noeud se présente.
    Protected Sub TV_TreeNodePopulate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.TreeNodeEventArgs) Handles TV.TreeNodePopulate
    Dim dtn As DataTable = dm.ExecuterRequeteSimple("SELECT Identifiant, Libelle FROM lobdjetBDD WHERE Parent = " & e.Node.Value & "ORDER BY Parent")
    'Donc, là on récupère le niveau où l'on est pour remplir la suite d'où le e.Node.Value
    	For Each dr As DataRow In dtn.Rows
    		Dim NewNode As New TreeNode(dr(1), dr(0))
    		NewNode.PopulateOnDemand = True
    		NewNode.Expanded = False
    		NewNode.SelectAction = TreeNodeSelectAction.None
    		e.Node.ChildNodes.Add(NewNode)
    	Next
    'Et on recommence le même travail que précédement, sauf que l'ajout final n'est pas le même, on ajoute au noeud et pas au TreeView direct.
    End Sub

  4. #4
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut
    Bonjour, j'ai pu avancer par quelques exemple que j'ai pu adapté :
    j'ai crée mon provider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
        using System;
        using Susing System;
    using System.Web;
    using System.Data.SqlClient;
    using System.Collections.Specialized;
    using System.Configuration;
    using System.Web.Configuration;
    using System.Collections.Generic;
    using System.Runtime.CompilerServices;
    using System.Configuration.Provider;
    using System.Security.Permissions;
    using System.Data.Common;
    using System.Data;
     
    [SqlClientPermission(SecurityAction.Demand, Unrestricted = true)]
    public class SqlSiteMapProvider : StaticSiteMapProvider
    {
        private const string _errmsg1 = "Missing node ID";
        private const string _errmsg2 = "Duplicate node ID";
        private const string _errmsg3 = "Missing parent ID";
        private const string _errmsg4 = "Invalid parent ID";
        private const string _errmsg5 =
            "Empty or missing connectionStringName";
        private const string _errmsg6 = "Missing connection string";
        private const string _errmsg7 = "Empty connection string";
     
        private string _connect;
        private int _indexID, _indexTitle, _indexUrl,
            _indexDesc, _indexRoles, _indexParent;
        private Dictionary<int, SiteMapNode> _nodes =
            new Dictionary<int, SiteMapNode>(16);
        private SiteMapNode _root;
     
        public override void Initialize(string name,
            NameValueCollection config)
        {
            // Verify that config isn't null
            if (config == null)
                throw new ArgumentNullException("config");
     
            // Assign the provider a default name if it doesn't have one
            if (String.IsNullOrEmpty(name))
                name = "SqlSiteMapProvider";
     
            // Add a default "description" attribute to config if the
            // attribute doesn't exist or is empty
            if (string.IsNullOrEmpty(config["description"]))
            {
                config.Remove("description");
                config.Add("description", "SQL site map provider");
            }
     
            // Call the base class's Initialize method
            base.Initialize(name, config);
     
            // Initialize _connect
            string connect = config["connectionStringName"];
     
            if (String.IsNullOrEmpty(connect))
                throw new ProviderException(_errmsg5);
     
            config.Remove("connectionStringName");
     
            if (WebConfigurationManager.ConnectionStrings[connect] == null)
                throw new ProviderException(_errmsg6);
     
            _connect = WebConfigurationManager.ConnectionStrings
                [connect].ConnectionString;
     
            if (String.IsNullOrEmpty(_connect))
                throw new ProviderException(_errmsg7);
     
            // In beta 2, SiteMapProvider processes the
            // securityTrimmingEnabled attribute but fails to remove it.
            // Remove it now so we can check for unrecognized
            // configuration attributes.
     
            if (config["securityTrimmingEnabled"] != null)
                config.Remove("securityTrimmingEnabled");
     
            // Throw an exception if unrecognized attributes remain
            if (config.Count > 0)
            {
                string attr = config.GetKey(0);
                if (!String.IsNullOrEmpty(attr))
                    throw new ProviderException
                        ("Unrecognized attribute: " + attr);
            }
        }
     
        public override SiteMapNode BuildSiteMap()
        {
            lock (this)
            {
                // Return immediately if this method has been called before
                if (_root != null)
                    return _root;
     
                // Query the database for site map nodes
                SqlConnection connection = new SqlConnection(_connect);
     
                try
                {
                    connection.Open();
                    SqlCommand command =
                        new SqlCommand("siteMenu", connection);
                    command.CommandType = CommandType.StoredProcedure;
                    SqlDataReader reader = command.ExecuteReader();
                    _indexID = reader.GetOrdinal("idMenu");
                    _indexUrl = reader.GetOrdinal("url");
                    _indexTitle = reader.GetOrdinal("Menu");
                    //_indexDesc = reader.GetOrdinal("Description");
                    //_indexRoles = reader.GetOrdinal("Roles");
                    _indexParent = reader.GetOrdinal("idParent");
     
                    if (reader.Read())
                    {
                        // Create the root SiteMapNode and add it to
                        // the site map
                        _root = CreateSiteMapNodeFromDataReader(reader);
                        AddNode(_root, null);
     
                        // Build a tree of SiteMapNodes underneath
                        // the root node
                        while (reader.Read())
                        {
                            // Create another site map node and
                            // add it to the site map
                            SiteMapNode node =
                                CreateSiteMapNodeFromDataReader(reader);
                            AddNode(node,
                                GetParentNodeFromDataReader(reader));
                        }
                    }
                }
                finally
                {
                    connection.Close();
                }
     
                // Return the root SiteMapNode
                return _root;
            }
        }
     
        protected override SiteMapNode GetRootNodeCore()
        {
            BuildSiteMap();
            return _root;
        }
     
        // Helper methods
        private SiteMapNode
            CreateSiteMapNodeFromDataReader(DbDataReader reader)
        {
            // Make sure the node ID is present
            if (reader.IsDBNull(_indexID))
                throw new ProviderException(_errmsg1);
     
            // Get the node ID from the DataReader
            int id = reader.GetInt32(_indexID);
     
            // Make sure the node ID is unique
            if (_nodes.ContainsKey(id))
                throw new ProviderException(_errmsg2);
     
            // Get title, URL, description, and roles from the DataReader
            string title = reader.IsDBNull(_indexTitle) ?
                null : reader.GetString(_indexTitle).Trim();
            string url = reader.IsDBNull(_indexUrl) ?
                null : reader.GetString(_indexUrl).Trim();
            //string description = reader.IsDBNull(_indexDesc) ?
                //null : reader.GetString(_indexDesc).Trim();
            //string roles = reader.IsDBNull(_indexRoles) ?
                //null : reader.GetString(_indexRoles).Trim();
     
            // If roles were specified, turn the list into a string array
            /*string[] rolelist = null;
            if (!String.IsNullOrEmpty(roles))
                rolelist = roles.Split(new char[] { ',', ';' }, 512);*/
     
            // Create a SiteMapNode
            SiteMapNode node = new SiteMapNode(this, id.ToString(), url, title);
     
            // Record the node in the _nodes dictionary
            _nodes.Add(id, node);
     
            // Return the node        
            return node;
        }
     
        private SiteMapNode
            GetParentNodeFromDataReader(DbDataReader reader)
        {
            // Make sure the parent ID is present
            if (reader.IsDBNull(_indexParent))
                throw new ProviderException(_errmsg3);
     
            // Get the parent ID from the DataReader
            int pid = reader.GetInt32(_indexParent);
     
            // Make sure the parent ID is valid
            if (!_nodes.ContainsKey(pid))
                throw new ProviderException(_errmsg4);
     
            // Return the parent SiteMapNode
            return _nodes[pid];
        }
    }
    Mon web.config :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0"?>
    <configuration>
    	<system.web>
    		<siteMap defaultProvider="SqlSiteMapProvider">
    			<providers>
    				<add 
    				  name="SqlSiteMapProvider"
    				  type="SqlSiteMapProvider"
    				  connectionStringName="Data Source=localhost;Initial Catalog=BD;Integrated Security=True"/>
    			</providers>
    		</siteMap>
    	</system.web>
    </configuration>
    et je n'ai rien mit dans mon web.sitemap;

    le menu s'affiche correctement sauf que lorsque je modifie dans la base ca ne se repecute que lorsque je redemarre mon pc !

  5. #5
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Il est automatiquement mis en cache par ASP.NET
    Faut chercher le moyen de mettre à jour le cache

    Si t'utilises SQL Server, tu peux passer par un CacheDependency

  6. #6
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut
    Maintenant, j'ai réussi à mettre en place mon provider qui me crée mon menu, mais ce que je cherche a faire c'est de generer le fichier sitemap a partir de la table au lieu de generer directement le menu, vous avez un exmple de ca ?

Discussions similaires

  1. Réponses: 9
    Dernier message: 30/12/2005, 03h00
  2. Calcul à partir d'une table
    Par Didi17 dans le forum Access
    Réponses: 1
    Dernier message: 28/10/2005, 08h37
  3. [HTML] construire un mailto à partir d'une table
    Par Kafi dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 08/09/2005, 16h01
  4. Réponses: 4
    Dernier message: 02/05/2005, 20h25
  5. Réponses: 9
    Dernier message: 07/10/2004, 19h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo