Probleme de siteMap et treeview crée dynamiquement

Signaler
Messages postés
51
Date d'inscription
mardi 25 septembre 2001
Statut
Membre
Dernière intervention
9 décembre 2009
-
Messages postés
51
Date d'inscription
mardi 25 septembre 2001
Statut
Membre
Dernière intervention
9 décembre 2009
-
Hello,

J'ai un souci avec mon siteMap source de mon treeview.

Je crée un string XML contenant mon siteMap crée sur base d'une DB sqlserver.

Tout fonctionne bien, gros problème, c'est qu'au lieu d'avoir en titre de menu le title de mon sitemap et en lien, l'url j'ai le mot siteMapNode qui s'affiche partout.

Pourriez-vous m'aider merci?


voici mon code

Code :


 Private Function buildXMLMenu(ByRef oDataSet As DataSet) As String
        'Dim parentNode As TreeNode
        ' Dim childNode As TreeNode
        Dim sortSubMenu As String
        sortSubMenu = "LevelOrder ASC"
        Dim selectSubMenu As String
 
        Dim navigateString As StringBuilder = New StringBuilder()
        ' En-tete du fichier Site Map File
        navigateString.Append("<?xml version=""1.0"" encoding=""utf-8"" ?>")
        navigateString.Append("<siteMap xmlns=""http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"">")
 
        For Each parentRows As DataRow In oDataSet.Tables("Menu").Select("MenuLevel = 0", sortSubMenu)
            selectSubMenu "UpperLevel " & parentRows.Item("ID").ToString
 
            ' création du sous-menu si existant
            If oDataSet.Tables("Menu").Select(selectSubMenu, sortSubMenu).Length > 0 Then
                ' menu parent avec menu enfant
                navigateString.Append("<siteMapNode title=""" & parentRows.Item("libla") & """>")
                For Each childRows As DataRow In oDataSet.Tables("Menu").Select(selectSubMenu, sortSubMenu)
                    navigateString.Append("<siteMapNode url=""" & childRows.Item("MenuAction") & """ title=""" & childRows.Item("libla") & """ />")
                Next
                navigateString.Append("</siteMapNode>")
            Else
                ' Menu parent sans menu enfant
                navigateString.Append("<siteMapNode url=""" & parentRows.Item("MenuAction") & """ title=""" & parentRows.Item("libla") & """ />")
            End If
        Next
        navigateString.Append("</siteMap>")
        buildXMLMenu = navigateString.ToString
    End Function
 

Code :


  Private Sub buildMenu()
        ' fonction pour attribuer au menu les informations récupérée par l'objet createMenu sous forme XML
        Dim menuDataSource As XmlDataSource = New XmlDataSource()
        menuDataSource.ID = "MainMenu"
        menuDataSource.Data = Session("siteMapMenu")
        menuDataSource.DataBind()
 
        mnuPerso.DataSource = menuDataSource
        mnuPerso.DataBind()
 
    End Sub

7 réponses

Messages postés
58
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
5 août 2009

Bonjour,

Tu peux réaliser ton siteMap dynamiquement en utilisant les objets ASP.Net.

1/ tu crées un SiteMapDataSource



2/ Tu crées ton Treeview que tu bindes à ton SiteMapDataSource



3/Tu dois modifier le provider de ton siteMapDataSource pour pouvoir récupérer tes données à partir d'une base de données :

[list]
- Je te conseille de créer une table dans laquelle tu stockeras tes tuples du siteMap
- Je te conseille également de créer une procédure stockée qui te renverra l'ensemble des informations à la création dynamique de ton siteMap
/list

A partir de ce moment tu peux commencer à créer un provider spécifique à ton siteMap, pour cela tu dois faire dériver la classe de ton provider personnalisé de
StaticSiteMapProvider


4 / Tu mets à jour ton Web.Config pour le chargement des constantes d'initialisation de ton siteMapProvider :

<system.web>
<siteMap defaultProvider="SqlSiteMapProvider">




</siteMap>
...
</system.web>



5/ A partir de maintenant tu peux surcharger ta méthode substituée Initialize de ta classe de base (dans ce cas StaticSiteMapProvider). Tu as un exemple de code dans la msdn.

Bon courage

Jérôme GABRIEL
MCTS ASP.Net
Messages postés
51
Date d'inscription
mardi 25 septembre 2001
Statut
Membre
Dernière intervention
9 décembre 2009

Pas mal du tout et surtout très optimisé, mais mon souci à ce niveau c'est que le menu se construit en fonction de critère défini par le type de client et les autorisations dont il dispose.

je peux créer une storedprocedure mais je dois pouvoir lui passer nombres de paramètre qui déterminerons le visage de mon menu
Messages postés
51
Date d'inscription
mardi 25 septembre 2001
Statut
Membre
Dernière intervention
9 décembre 2009

De plus mon intention en plaçant mon sitemap dans une variable de session c'est que je ne veux pas devoir à chaque page et chaque refresh me reconnecter à ma db.

Donc en gros je créais mon siteMap lors de mon identification, et mon menu qui se trouve dans ma master page prend pour base cette variable de session plutot que de relancer chaque fois ma storedprocedure.

mais si tu as une meilleur solution

merci
Messages postés
58
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
5 août 2009

Bonjour,

Entre stocker des sitemaps par Session et appeler la meme procedure stockée, il faudrait voir quel est le plus optimisé !

Mais si tu passes par de l'identification ASP.Net je te conseillerai vivement d'utiliser les roles et de stocker tes sitemap par role dans le cache de ton application web (le cache te permet de partager tes sitemaps entre toutes les sessions et augmente les performances de ton application web). Du type:

private static string role = "role";
        protected void Page_Load(object sender, EventArgs e)
        {
            SiteMap map;
            
            if (User.IsInRole(role))
            {
                map = GetSiteMapByRole(); 
            }
        }

        private static SiteMap GetSiteMapByRole()
        {
            return GetCacheSiteMap();
        }

        private static SiteMap GetCacheSiteMap()
        {
            if (HttpContext.Current.Cache[role] != null)
            {
                return (SiteMap)HttpContext.Current.Cache[role];
            }
            else
            {
                //Appel de ta Proc Stock par la méthode GetdbSiteMap() et tu mets ton résultat immédiatement en cache
                return (SiteMap)HttpContext.Current.Cache[role] = GetdbSiteMap();
            }
        }
Messages postés
51
Date d'inscription
mardi 25 septembre 2001
Statut
Membre
Dernière intervention
9 décembre 2009

J'y ai déjà penser à stocker les sitemaps, mais le problème c'est que les combinaisons sont tellement nombreuses et diverses et en perpétuel changement.

Pour résumer le problème, je suis en train de faire passer des pages asp over-pourrie en asp.net en optimisant au maximum le code et les performances.

hors je ne peux pratiquement pas toucher à la db existante

avec une db du genre

id lien nom lienparent

le lienparent contient l'id du parent évidement pour permettre la création du sous-menu.

je dois donc cogité pour trouver LA meilleur solution sans devoir créer une liste de sitemaps.

j'y ai déjà perdu quelques neurones ;-)
Messages postés
58
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
5 août 2009

Re-bonjour,

Je pense que tu n'as pas bien compris ma réponse. Durant l'identification (je te conseille d'utiliser les authentifications ASP.Net), tu dois appliquer à chacun de tes utilisateurs un role sur ton application (tu peux avoir 1 à n utilisateur pour un role).
A partir de là tu peux gérer tes sitemaps par role(tu peux affecter les roles directement par l'attribut roles de chacun des siteMapNode de ton fichier avec l'extension .siteMap).
Si tu as des besoins plus spécifiques par utilisateur, tu peux également utiliser les profiles ASP.Net. Maintenant, je ne te cacherai pas que si tu as une application web avec authentification sans règle de sécurité par groupe d'utilisateur, je pense qu'il faudrait sans doute revoir la stratégie de sécurité du site.

Bon courage

Jérôme GABRIEL
MCTS ASP.Net
Messages postés
51
Date d'inscription
mardi 25 septembre 2001
Statut
Membre
Dernière intervention
9 décembre 2009

malheureusement le problème est la, je ne peux pas utiliser l'authentification .net, comme je l'ai dis avant je dois utiliser ce qui se trouve à ma dispo sans modifier sinon je risque la lapidation sur la place publique.

Les roles et authorisation sont géré par une DLL, je recois en le role du client ainsi que des switch pour authorisé ou non certain menu.

C'est affreusement barbare mais ca a fait ses preuves et donc c'est du "touche pas a ca ptit con" ;-)

c'est un peu pour cela que j'ai trouvé ma méthode la plus efficace vu le contexte.

Pouvoir gérer des rôles vu les infos que je recois releve du défi.