Register  Login  
  May 18, 2012  
 Search
 
Weblog      
Eigene User Controls verwenden Minimize
Location: BlogsDbTom's DNN Web Log    
Posted by: Thomas Trefz 06.02.2005 12:41
Das DNN Framework stellt bereits verschiedene User Controls, z.B. URLTracking, Adress, LabelControl etc. bereit. In meinem aktuellen Projekt werden eigene User Controls verwendet. Wie das geht und wo die Probleme liegen habe ich hier einmal zusammengefasst.

Projektziel

Ziel war die Erstellung eines User Controls zur Verwaltung von Informationen für einen Content Management Service. Das User Control erlaubt die Verwaltung eines Start- und Ende Datums, einer Statusauswahl (Erstellung, Genehmigung, Veröffentlicht etc.) und eines kleinen Kommentarfeldes. Dieses Control kann dann in jedem Modul eingesetzt werden um den Content Management Service zu verwenden.

Umsetzung

Alle verwendeten Komponenten werden im DesktopModules\DbTom Verzeichnis verwaltet. Es sollen keine Aenderungen im Bereich des DNN Frameworks vrogenommen werden. Also: eigene Verzeichnisse, eigene Namespaces und das Ganze später als PA distribuiert.

User Controls werden im DNN Framework von der Klasse UserControlBase abgeleitet und nicht wie bei den Modulen von PortalModuleBase. Das scheint zunächst nicht so schlimm, zeigt sich später jedoch als Problem. Der Aufruf eines Edit-Moduls mit meinem User Control zeigte direkt das die Labels nicht angezeigt werden. In jedem anderen Modul perfekt, nur nicht in meinem User Control. Das Verzeichnis App_LocalResouces inkl. der benötigten resx Dateien ist vorhanden, aber nichts zu sehen :(

Nach ein wenig "Grundlagenforschung" kommt folgendes "zu Tage":

Das LabelControl ruft in seinem Code Behind eine private Methode GetLocalizedText auf. Diese geht rekursiv durch den Control Tree und sucht nach dem Parent Control vom Typ PortalModuleBase um über dieses Control die Labels bzw. deren Übersetzungen zu lesen. Das würde aber bedeuten, das die Labels aus meinem User Control in den resx Dateien aller Module, die mein Control verwenden angegeben werden müssen. Das macht nicht wirklich Spass.

Sieht man sich die Methode GetLocalizedText weiter an, dann wird eine Ausnahme für das Control Address definiert. Aber leider nur für dieses :( Es wäre sinnvoller, wenn das Core Team hier für alle Controls vom Typ UserControlBase ein Verfahren ähnlich dessen für die Standardmodule implementieren würde.

Man wird jetzt sagen: dann ändere doch diese Methode! Aus meiner Erfahrung kann ich nur sagen: Hände weg vom Core System. Bei jedem neuen Update (und davon gibt es bekanntlich viele in kurzer Zeit) müssen sonst alle individuellen Veränderungen immer wieder neu geprüft und implementiert werden. Als treibende Kraft bei DotNetNukeXXL rede ich hier aus Erfahrung!

Ich habe das Problem einfach dadurch gelöst, das ich Label.Text und Label.HelpText einfach in meinem User Control manuell aus dem Resource File lesen und die Eigenschaften des Label Controls entsprechend setze. Das geht recht einfach mit der folgenden Programmzeile:

plStartDate.Text = Services.Localization.Localization.GetString("plStartDate.Text", Me.LocalResourceFile)

LocalResourceFile ist ein Public Property das den Namen meiner ascx Datei beinhaltet. bzw. diesen zurückgibt. Betrachtet man nochmal die Methode GetLocalizedText erkennt man, das dieses Property bereits bei den Standardmodulen abgefragt wird. Sollte das Core Team also hier etwas in gleicher Richtung ändern bin ich direkt am Start (hoffentlich :) )

Eine weitere Problemstellung ergab sich bei der Benutzung so elementarer Eigenschaften wie ModuleID, PortalID, ModuleSettings etc. Mein User Control ist ja kein Modul, soll aber die Informationen des Moduls in dem es eingesetzt wird lesen können. Konkreter Einsatz: wenn für das Modul die Einstellung "Content approval" gesetzt ist, dann soll mein User Control die Auswahliste mit den möglichen Content Stati (z.B. Erstellung, Genehmigung, Veröffentlicht, ...) anzeigen. Sonst nicht.

Ich habe mich für den folgenden Weg entschieden:

Über die Private Methode FindParent meines Controls finde ich das Parent Control vom Typ PortalModuleBase. Diese Referenz kann ich dann verwenden um auf alle Informationen des Moduls zugreifen zu können. Diese sind ohnehin alle vorhanden, warum also nochmal die Datenbank quälen? Hier der Code:

Private Function FindParent (ByVal ctl As System.Web.UI.Control) As DotNetNuke.Entities.Modules.PortalModuleBase
Dim parentControl As System.Web.UI.Control = ctl.Parent
If TypeOf parentControl is DotNetNuke.Entities.Modules.PortalModuleBase Then
Else
   parentControl = FindParent(parentControl)
End If
Return DirectCast(parentControl, DotNetNuke.Entities.Modules.PortalModuleBase
End Function

Na ja, und jetzt sieht das alles schon viel besser aus. Den gesamten Code zu diesem Projekt kann man nach Fertigstellung auf meiner Web Site herunterladen.

 

Permalink |  Trackback

Search MyBlog Minimize
  

Archiv Minimize

Blog Liste Minimize
  

  Home | Informationen | Verzeichnis | Downloads | Foren | Module | Weblog | Kontakt | Artikel  
  (c) 2002 - 2005 Schelian IT Beratung   Terms Of Use | Privacy Statement