Vous êtes ici Forums
  |  Connexion
 Forums
HomeHomeForums DNNForums DNNDéveloppementDéveloppementRecupérer lRecupérer l'évenement click du menu DNN
Précédente
 
Suivante
Nouveau message
23/01/2008 09:36
 

Bonjour,

Je cherche à récupérer l'évenement click d'un item du menu DNN (celui où il y a Hote et Site).

Quelqu'un sait il comment faire.

Merci d'avance.

 
Nouveau message
23/01/2008 14:52
 

Bonjour,

c'est un peu plus difficile que ça en a l'air, et ça dépend fortement du menu utilisé.

Petit rappel:

Un menu DNN est un skin object un peu particulier, qui est construit a partir d'un provider de navigation.

Il existe deux principaux skin objects natifs de menu, nav.ascx et solpart.ascx. Tous deux héritent  de NavObjectBase lui même héritant de SkinObjectBase.

NavObjectBase expose une propriété Control de type NavigationProvider, ce dernier correspondant au menu effectif utilisé, et exposant un évenement NodeClick que vous souhaitez interceptez.

La première chose est de vérifier dans votre skin le skin object qui est utilisé.

nav.ascx est générique et supporte tous les providers de navigation (y compris le solpart). solpart.ascx supporte également différents provider mais il est conçu plus spécifiquement pour le provider solpart et définit un certain nombre de propriétés par défaut.

Dans les deux cas, vous voudrez probablement créer un nouveau skin object spécifique à votre menu, histoire de ne pas modifier l'existant et faciliter les montées de versions, et afin de rajouter votre handler spécifique sur l'évenement NodeClick.

Il s'agit donc de créer un nouvel ascx par copie de celui qui est utilisé, de faire hériter la classe de codebehind de la précédente et de personnaliser ainsi:

        Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
          MyBase.OnInit(e)
            AddHandler Control.NodeClick, AddressOf VotreMethodeSpecifique
                     
        End Sub

        Private Sub VotreMethodeSpecifique(ByVal args As NavigationProvider.NavigationEventArgs)
            If args.Node Is Nothing Then
                args.Node = Navigation.GetNavigationNode(args.ID, Control.ID)
            End If

            ' Votre code spécifique ici

        End Sub

On pourrait penser que cela suffit mais maintenant tout dépend du provider utilisé.

Pour rappel, les providers de navigation sont définis dans le fichier web.config (cf ce fichier vers la fin), et pour un skinobject de navigation, celui à appliquer est défini par la propriété ProviderName (à définir dans le tag server du skin object dans l'ascx de la skin). Si aucun provider n'est déclaré, c'est le solpart qui est appliqué par défaut (pour nav.ascx comme pour solpart.ascx).

Or il se trouve que le solpart ne déclanchera pas l'évenement nodeclick par défaut, et qu'au lieu de cela, la redirection sera déclanchée au niveau client. La raison à cela est qu'il construit son arbre de noeuds sur les bases de la DNNNodeCollection que lui fournissent nav.ascx ou solpart.ascx et qu'il définira pour chaque item du menu la propriété de déclanchement d'un postback en fonction de la propriété ClickAction du DNNNode.

Or nav.ascx et solpart.ascx utilisent tous deux la fonction DotNetNuke.UI.Navigation.GetNavigationNodes(...) qui définit pour chaque noeud cette propriété à eClickAction.Navigate au lieu de . eClickAction.Postback qui aurait fait l'affaire puisque le provider solpart dans un tel cas redirige correctement l'évement interne déclanché vers un évement NodeClick.

Deux solutions s'offrent alors à vous: interceptez la méthode GetNavigationNodes afin de corriger chaque noeud pour lui attribuer la bonne valeur, ou bien déclarer un nouveau provider de navigation, héritant de celui que vous utilisez, et pour lequel vous overridez la méthode Bind(DNNNodeCollection) afin qu'elle ne tienne pas compte du ClickAction des DNNNodes. Le provider correspondant devra être déclaré dans le web.config et attribué en propriété du skin object de menu.

La première présente l'avantage de fonctionner sur d'autres providers, mais rajoutera un peu plus de temps de traitement que la deuxième.

Voilà à peu près tout pour ce point spécifique, qui peut paraître assez compliqué, mais qui ne devrait au final pas nécessiter trop de développement pour fonctionner.

++


Jesse
Société de conseil et de service en 
informatique et systèmes d'information
 
Précédente
 
Suivante
HomeHomeForums DNNForums DNNDéveloppementDéveloppementRecupérer lRecupérer l'évenement click du menu DNN