Probleme de siteMap et treeview crée dynamiquement
kaygee
Messages postés51Date d'inscriptionmardi 25 septembre 2001StatutMembreDernière intervention 9 décembre 2009
-
3 août 2009 à 15:20
kaygee
Messages postés51Date d'inscriptionmardi 25 septembre 2001StatutMembreDernière intervention 9 décembre 2009
-
5 août 2009 à 10:30
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
A voir également:
Probleme de siteMap et treeview crée dynamiquement
cs_gabj
Messages postés58Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention 5 août 2009 3 août 2009 à 17:18
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 :
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.
kaygee
Messages postés51Date d'inscriptionmardi 25 septembre 2001StatutMembreDernière intervention 9 décembre 2009 4 août 2009 à 11:01
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
kaygee
Messages postés51Date d'inscriptionmardi 25 septembre 2001StatutMembreDernière intervention 9 décembre 2009 4 août 2009 à 11:09
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.
cs_gabj
Messages postés58Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention 5 août 2009 4 août 2009 à 11:38
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();
}
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
kaygee
Messages postés51Date d'inscriptionmardi 25 septembre 2001StatutMembreDernière intervention 9 décembre 2009 4 août 2009 à 12:55
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.
cs_gabj
Messages postés58Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention 5 août 2009 4 août 2009 à 14:28
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.
kaygee
Messages postés51Date d'inscriptionmardi 25 septembre 2001StatutMembreDernière intervention 9 décembre 2009 5 août 2009 à 10:30
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.