Bon et puis tant qu'a faire maintenant que je suis lancé:
Tu nous a montré l'usage du multiview, qui est bon en soit, mais il me semble qu'il ne s'agit pas d'en faire usage la ou le modèle de clés de définition standard s'applique. Je m'explique:
Les modules dnn sont composés d'un jeu de formulaires (héritant de portalModuleBase) associés à une clé (paramètre http) et à une permission.
Sur le Text/Html pour prendre un exemple simple, tu as le controle principal de visualisation (clé vide, permission "View") et le contrôle d'édition via l'éditeur de texte riche (clé "Edit", permission "Edit").
Depuis le controle de vue, tu peux passer sur le controle d'edtion avec:
Response.Redirect(Me.EditUrl("Edit"))
Mieux, tu as également un système d'actions, matérialisé par le menu déroulant, ainsi que des boutons configurables dans le container graphique, que tu peux également associer à la navigation vers tes formulaires. La définition de ce menu est accessible via l'implementation dans tes formulaires (PortalModuleBase) de l'interface IActionable.
Ex d'utilisation riche:
Public ReadOnly Property ModuleActions() As DotNetNuke.Entities.Modules.Actions.ModuleActionCollection Implements DotNetNuke.Entities.Modules.IActionable.ModuleActions
Get
Dim Actions As New DotNetNuke.Entities.Modules.Actions.ModuleActionCollection
If Me.IsEditable Or (Me.limitOK And (Me.HasModulePermission(Modules.HTMLMapMaker.Security.Permissions.Permissions.PermissionKey(Permission.SubmitHotSpot)) _
Or Me.HasModulePermission(Modules.HTMLMapMaker.Security.Permissions.Permissions.PermissionKey(Permission.SubmitHotSpot)))) Then
If Me.MapID <> -1 Then
Actions.Add(GetNextActionID, Localization.GetString(Entities.Modules.Actions.ModuleActionType.EditContent, LocalResourceFile), Entities.Modules.Actions.ModuleActionType.AddContent, "", "", Me.NavigateModuleURL(HtmlMapMakerForm.Edit, Me.MapID), False, DotNetNuke.Security.SecurityAccessLevel.View, True, False)
If Me.IsEditable Or Me.CanPerformAction(Permission.SubmitHotSpot) Then
Actions.Add(GetNextActionID, Localization.GetString("AddHotSpot.Action", LocalResourceFile), Entities.Modules.Actions.ModuleActionType.AddContent, "", "", Me.NavigateModuleURL(HtmlMapMakerForm.EditHS, Me.MapID), False, DotNetNuke.Security.SecurityAccessLevel.View, True, False)
End If
End If
End If
If Me.IsEditable Or (Me.limitOK And Me.CanPerformAction(Permission.SubmitMap)) Then
Actions.Add(GetNextActionID, Localization.GetString(Entities.Modules.Actions.ModuleActionType.AddContent, LocalResourceFile), Entities.Modules.Actions.ModuleActionType.AddContent, "", "", Me.NavigateModuleURL(HtmlMapMakerForm.Edit, -1), False, DotNetNuke.Security.SecurityAccessLevel.View, True, False)
End If
Actions.Add(GetNextActionID, Localization.GetString("ImportMap.Action", LocalResourceFile), Entities.Modules.Actions.ModuleActionType.AddContent, "", "", Me.NavigateModuleURL(HtmlMapMakerForm.Import, -1), False, DotNetNuke.Security.SecurityAccessLevel.Edit, True, False)
Actions.Add(GetNextActionID, "Importer une couche", Entities.Modules.Actions.ModuleActionType.AddContent, "", "", EditUrl("ImportCouche"), False, DotNetNuke.Security.SecurityAccessLevel.Edit, True, False)
Return Actions
End Get
End Property
Bon bien sûr, tu peux toi même implémenter ta propre gestion de chargement de contrôles dynamiques dans un multiview avec ton paramêtre de querystring perso, et c'est parfois nécessaire de la faire en plus, mais bon l'api est quand même la pour ça donc il me semble que le multiview ne devrait être utilisé que pour enrichir un formulaire complexe parmi les autres, plutôt que pour implémenter la diversité des formulaires (ceux que tu nous a montré semblent se prêter à l'utilisation standard dans une définition multicontroles)
Ensuite, il y a la localisation, je crois que tu as déjà jeté un coup d'oeil la dessus.
Pour rappel, la classe Localization expose l'ensemble des méthodes utiles, principalement GetString(...), que tu peux utiliser à chaud dans un formulaire.
Il y a aussi les attributs Resourcekey dans les ascx (je suppose que c'est ce que tu as utilisé). Leur utilisation prend corps dans le PreRender de la classe Pagebase dont hérite la page en cours: l'ensemble des contrôles de la page sont parcourus, et pour ceux qui possèdent cet attribut, la fonction GetString mentionnée ci-dessus est appellée, et les propriétés correspondantes mises à jour selon le type de controle. Bon c'était juste pour te dire ou ça se passe si tu es passé à côté.
Petite subtilité: la méthode GetString prend en paramètre le nom du resx (sans le suffixe de locale). Celui-ci est accessible via la propriété LocalResourceFile dans PortalModuleBase, ce qui est relativement transparent. Maintenant, si tu souhaites utiliser des UserControles enfant, et conserver des resx spécifiques à ces controles, il est bon de leur attribuer une telle propriété, sinon les fichiers de resources principaux sont mis à contribution ce qui n'est pas top en termes de duplicatats.
En 1.1, j'utilisais ce genre de code:
Public Property MyFileName() As String
Get
If Me._MyFileName = "" Then
Me.MyFileName = Me.GetType.Name.Replace("_ascx", ".ascx")
End If
Return Me._MyFileName
End Get
Set(ByVal Value As String)
Me._MyFileName = Value
End Set
End Property
Public Property LocalResourceFile() As String
Get
If Me._localResourceFile = "" Then
Me._localResourceFile = DotNetNuke.Services.Localization.Localization.GetResourceFile(Me, Me.MyFileName)
End If
Return Me._localResourceFile
End Get
Set(ByVal Value As String)
_localResourceFile = Value
End Set
End Property
Bon, pour le reste, je pense que tu as du déjà parcourir une partie des espaces de nom. L'espace de nom "Services" est assez riche, encore que certaines fonctions principales sont parfois situées plutôt dans "Common" (ex du cache, ou de certaines fonctions de gestion des fichiers etc...), donc il ne faut pas oublier d'y jeter un coup d'oeil.
Enfin n'oublie pas d'utiliser à bon escient les User Controles DNN (contrôle URL pour la sélection des url ou des fichiers, contrôle RichTextEditor pour l'utilisation du fck/ftb selon le provider etc...), et si tu as du temps de jeter un oeil à
- l'API cliente (intégration et contrôles AJAX + nombreux helpers d'intégration vb/javascript, dans les dll DotNetNuke.WebUtilities et DotNetNuke.WebControls et dans le répertoire js pour le framework javascript),
- aux contrôles dynamiques (PropertyEditor & co, qui correspondent à quelque chose près à des FormView semi-automatisés, mentionés durant ta présentation par Mr Généré de la société SmartFocus)
Voilà, il y a sans doute des chose dans tout ça que tu auras déjà vu, mais bon tu dois pouvoir piocher.
A+
PS: Je te parlerais bien d'OlyMars à la lumière de notre expérience sur LLBLGen, mais ça pourra faire l'objet d'un autre post ou d'un email.