Fehler BC30456: „Framework“ ist kein Member von „DotNetNuke.UI.Skins.Controls.DotNetNuke“

Nachdem ich mit der weiter unten beschriebenen Systemumgebung versucht habe die Source Version von DotNetNuke Version 5.6.2 zu installieren und zu übersetzen habe ich den nachfolgenden Fehler erhalten:

Fehler BC30456: „Framework“ ist kein Member von „DotNetNuke.UI.Skins.Controls.DotNetNuke“

Nachdem ich kurz versucht habe über Google eine Lösung zu finden und dort als Lösung einen Tipp vorgefunden habe der vorschlägt einfach nicht die Source Version zu verwenden, habe ich nur den Kopf geschüttelt und selbst nach einer Lösung gesucht.

Hier aber nun zur Lösung des Problems und zur verwendeten Systemumgebung:

  • Windows 7 Rechner
  • Visual Studio 2010 SP1
  • IIS Express (7.5)
  • DotNetNuke Version 5.6.2 Source Version (diese Version)

Nachdem ich also DNN 5.6.2 auf dem Rechner installiert habe und die Solution in Visual Studio unter IIS Express eingerichtet habe, wollte ich das Gesamte Projekt übersetzen.

Das ist aber mit dem oben beschriebenen Fehler gescheitert.

Um den Fehler zu beheben muss man folgende Änderung in der Datei: jQuery.ascx.vb welche im Unterordner amin/Skins des Website Root Verzeichnises zu finden ist, vornehmen.

Der Aufruf Im Page.Init Event muss wie folgt geändert werden.

Hier der Source des Originalevent

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
	DotNetNuke.Framework.jQuery.RequestRegistration()
End Sub

Hier der geänderte Source, man beachte das Global vor dem Verweis auf DotNetNuke

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
	Global.DotNetNuke.Framework.jQuery.RequestRegistration()
End Sub

Nach dieser Änderung kann man die Solution Fehlerfrei übersetzen.

Übrigens habe ich später doch noch einen Hinweis im Web gefunden, welcher die gleiche Lösung parat hält wie die hier von mir beschriebene.

Ich möchte daher an dieser Stelle auch auf diesen englischsprachigen Beitrag hinweisen.

Compilation error in dnn 5.6.2

DotNetNuke – FolderController – Obsolete Klasse

Im vorläufig letzten Teil meiner kleinen Serie „Clean Code meiner DotNetNuke Module“ geht es Heute um eine ganze Klasse, welche unter DotNetNuke 6.0 nicht mehr weiter verwendet werden soll.

Die Klasse wird mit Obsolete gekennzeichnet und soll durch die neue Klasse FolderManager ersetzt werden.

Allerdings trifft dies nicht für alle Methoden aus der alten Klasse FolderController zu.

Ich hatte in einem meiner Module den nachfolgenden Code eingesetzt um aus einem virtuellen Verzeichnis den absoluten Pfad auf dem Server zu ermitteln.

FolderController folderController = new FolderController();
string mappedTargetModuleFolder = folderController.GetMappedDirectory(portalFolder);

Nun sucht man in der neuen Klasse FolderManager aber vergebens nach einer Ersetzung für diese Methode.

Doch gibt es natürlich auch hiefür eine Lösung.

Im Namespace DotNetNuke.Common.Utilities finden wir die Klasse PathUtils und diese Klasse enthält eine Methode MapPath, die genau die Funktionaltität der zu ersetzenden Methode aus der Klasse FolderController erfüllt.

Und so sieht dann der Code aus:

string mappedTargetModuleFolder = PathUtils.Instance.MapPath(portalFolder);

DotNetNuke – GetModuleDefinitionByName – Obsolete

Heute geht es in meiner Serie „Clean Code meiner DotNetNuke Module“ um die Methode GetModuleDefinitionByName() aus dem Namespace
DotNetNuke.Entities.Modules.Definitions.ModuleDefinitionController.

Der Einsatz dieser Methode war immer schone etwas umständlich da man nicht direkt den Friendly Name verwenden konnte sondern dieser erst über den Umweg des DesktopController ermitteln musste.

Um wie im folgenden Beispiel die ModuleDefId einer Moduls ermitteln zu können, musste man 2 verschiedene Controller Klassen ansprechen.

  • ModuleDefinitionController
  • DesktopModuleController

Diese Methode wurde bereits mit der Version 5.0 ersetzt.

Bis zur Version 5 wurde die Methode wie folgt verwendet:


ModuleDefinitionController moduleDefinitionController = new ModuleDefinitionController();
int newModulDefId = moduleDefinitionController.GetModuleDefinitionByName(
desktopModuleController.GetDesktopModuleByName("DNNPortal-Download").DesktopModuleID, 
"DNNPortal-Download").ModuleDefID;

Hier nun der Aufruf mit der neuen Methode:


int newModulDefId = ModuleDefinitionController.GetModuleDefinitionByFriendlyName("DNNPortal-Download").ModuleDefID;

DotNetNuke – PortalSecurity.HasEditPermissions – Obsolete

In der Serie Clean Code meiner DotNetNuke Module geht es Heute um die Methode PortalSecurity.HasEditPermissions().

Ebenfalls seit der DotNetNuke Version 5.0 ist die Methode HasEditPermissions() aus dem Namespace DotNetNuke.Security.PortalSecurity nicht mehr zu verwenden.

Die beschriebene Methode wird dazu verwendet, zu ermitteln ob der angemeldete Benutzer die Rechte zur Bearbeitung für ein bestimmtes Modul besitzt.

Ein Aufruf, der bis zur Version 5.0 wie folgt ausgesehen hat:


if (PortalSecurity.HasEditPermissions(ModuleId, TabId))

sollte nun durch den nachfolgenden Aufruf ersetzt werden.


if(ModulePermissionController.HasModuleAccess(
SecurityAccessLevel.Edit,
"EDIT",
this.ModuleConfiguration))

Mehr folgt in Kürze

DotNetNuke.Entities.Portals.PortalSettings.GetHostSettings() – Obsolete

Auf der Suche nach dem Clean Code meiner DotNetNuke Module werde ich in den nächsten Tagen über einige kleine Migrationsschritte berichten.

Beginnen werde ich in diesem Sinne mit der Ersetzung der bereits seit DotNetNuke Version 5.0 obsoleten Methode GetHostSettings aus dem Namespace DotNetNuke,Entities,Portals.PortalSettings.

Hier ein Code Auszug aus einem DNN Modul, welcher bis zur DotNetNuke Version 5.0 Verwendung so oder ähnlich eingesetzt wurde.

Der Code dient dazu, die in einem Portal erlaubten Dateiendungen zu ermitteln. Oder mit anderen Parametern einfach eine Einstellung auf Host Ebene auszulesen

string fileExtensions = DotNetNuke.Entities.Portals.PortalSettings.GetHostSettings()["FileExtensions"].ToString().ToLower();

Für die obsolete Methode kann man nun folgende beiden Varianten verwenden:


string fileExtensions = HostController.Instance.GetSettingsDictionary()["FileExtensions"].ToString().ToLower();

oder diese variante


string fileExtensions = HostController.Instance.GetString("FileExtensions").ToLower();

Ich persönlich finde die Variante mit GetString() in diesem Fall die angebrachtere.

DotNetNuke mit C# auf dem richtigen Weg, aber noch nicht am Ziel! (CTP-3)

Nachdem nun bereits die dritte CTP Version von DotNetNuke 6.0 verfügbar ist, ist es an der Zeit sich einmal den Source der C# Version genauer anzuschauen.

Vorab aber noch einmal

„Gratulation an DotNetNuke“

für die Entscheidung das Projekt von VB nach C# zu migrieren.

Das ist auf jeden Fall eine Zeitgemäße und Zukunftsweisende Entscheidung.

Und ebenfalls Gratulation für die im großen und ganzen gute Umsetzung der C# Migration, bis hierhin.

Nach dem herunterladen und dekomprimieren der Source Version, gelingt es beim ersten Versuch, die Solution in Visual Studio zu laden und anschließend zu erstellen.

Das war in der Vergangenheit nicht immer so (eher sogar selten).

Dennoch bin ich mehr als nur ein wenig enttäuscht, dass man im Zuge der Migration nicht gleich einen einheitlichen Stil für die Erstellung des Source Code (Design Guidelines) im Stile von StyleCop eingeführt und umgesetzt hat.

Auf jeden Fall sind solche Regeln im vorhandenen Source Code (noch) nicht durchgängig zu erkennen..

Schade finde ich auch die fehlende bzw. nur sehr spärlich vorhandene Kommentierung des Source Code.

Ich werde auf jeden Fall, jetzt wo DotNetNuke ein C# Projekt geworden ist, und somit in meiner bevorzugten Programmiersprache entwickelt wird, wieder ein wachsames Auge auf das Projekt werfen.

Meine eigenen DotNetNuke Module werden in naher Zukunft ebenfalls so überarbeiten, dass diese unter der neuen Version lauffähig sein werden.

Wer mehr über die aktuellen Beta und CTP Versionen erfahren möchte, kann dies unter dem nachfolgenden Link direkt auf http://www.dotnetnuke.com nachlesen.

Beta Informationen zu DotNetNuke

DotNetNuke setzt in Zukunft voll auf C#

Laut einer Meldung der DotNetNuke Corporation wird DotNetNuke in Zukunft auch im Core und Core Module in C# entwickelt anstelle in VB.

Seit Jahren hat sich DotNetNuke Corp. vehement gegen eine Umstellung von VB zu C# als Entwicklungssprache gewehrt. Ich selbst habe während meiner Zeit als Projektleiter eines DotNetNuke Core Moduls (Blog Module) etliche Diskussionen mit den US Boys über das Thema geführt.

Bereits im Jahr 2005 habe ich angefangen DotNetNuke Module in C# zu entwickeln, anfangs noch von vielen belächelt, aber im Laufe der Jahre mit immer mehr Selbstverständlichkeit angenommen und später vielfach auch von anderen als Selbstverständlich übernommen.
Heute gibt es eine Fülle von DNN Modulen die bereits in C# programmiert sind.

Laut der Meldung soll die Umstellung des Core Framework mit DotNetNuke 6.0 vollzogen werden.

Das erste Core Modul „Q&A“ soll sich ebenfalls bereits in der Umstellung befinden.

Da ich selbst im Laufe meines Entwicklerlaufbahn einige Projekte von VB auf C# umgestellt (nicht nur DNN Module) und weiß daher, dass dies nicht einfach mit einem Generator 1:1 gemacht werden kann. Schon gar nicht wenn man lesbaren Code erhalten möchte. Daher stellt sich die Frage, ob DotNetNuke 6.0 nahe an einer SharpNetNuke Version 1.0 sein wird. Damit meine ich nicht den Funktionsumfang, sondern die Fehlerträchtigkeit.

Ich hoffe, dass dies nicht geschehen wird.

Übrigens soll die Version 6.0 irgendwann im 2. Quartal 2011 verfügbar gemacht werden.

Ich freue mich jedenfalls drauf, dann macht es auch wieder mehr Spaß am und im den Core Quellcode herum zu programmieren.

DotNetNuke Corporation übernimmt Active Modules Inc. – Wohl oder Wehe

Seit Gestern Abend geht folgende Meldung über den Ticker, äh Verzeihung Twitter:

DotNetNuke Corporation Acquires „Social Collaboration Vendor“ „Active Modules Inc.“

Neben einer ganzen Reihe von Gratulationen für den bisherigen Inhaber von Active Modules und einer offiziellen Pressemeldung sind eine Reihe von Spekulationen veröffentlicht worden.

Über das Wohl oder Wehe dieser Übernahme möchte ich an dieser Stelle nicht spekulieren und belasse es in diesem Beitrag mit einer kurzen Zusammenfassung was diese Übernahme nach offiziellen Aussagen für DotNetNuke und die Community bedeutet.

Mit der Übernahme von Active Modules spült es 3 Module in den Pool von DotNetNuke

  • Active Forum
  • Active Social
  • Active Purchase

Active Forum soll dass bisherige DNN Forum Modul ablösen (na endlich)

Active Social soll das Thema Soziale Netzwerke in DotNetNuke abdecken (auch gut so)

Active Purchase wird in der Professional und Enterprise Version integriert und bleibt somit den Community Anwendern vorenthalten (macht auch nichts)

Die Zeit wird zeigen, in wieweit es, für wen, Wohl oder Wehe sein wird

WebMatrix und DotNetNuke – Noch nie war es einfacher !!!

Am Wochenende habe ich mir etwas Zeit genommen um mir die Installation von DotNetNuke unter Zuhilfenahme von WebMatrix anzuschauen.

Als kurzes Resumé sei gleich am Anfang gesagt:

Es war noch nie einfacher DotNetNuke zu installieren als mit WebMatrix !

Als erstes muss WebMatrix installiert werden. Dazu lädt man sich den WebInstaller von hier herunter und startet den Installer. Die Gesamte Installation kann gut und gerne (je nach Download Geschwindigkeit) eine halbe Stunde oder etwas mehr dauern.

Während der Installation von WebMatrix werden nachfolgend aufgelistete Programme automatisch installiert.

Je nachdem, auf welchem Betriebssystem man WebMatrix installiert und welche anderen Programme man vorher schon installiert hat, ist während der Installation ein Neustart notwendig.

Nachdem WebMatrix installiert ist und der Schnellstart Bildschirm angezeigt wird, wählt man „Website aus Web Gallery“ aus.

In der Web Gallery steht DotNetNuke auch gleich als erstes Programm zur Auswahl zur Verfügung.

Einfach DotNetNuke auswählen und auf den Button Weiter klicken.

Nun werden die für DotNetNuke zu installierenden Programme / Komponenten angezeigt.

Je nachdem welche Programme bereits auf dem Rechner installiert sind, wird nur das DotNetNuke Paket oder noch zusätzlich der SQL Server Express aufgeführt.

Der SQL Server 2008 Express (es würde auch mit einer 2005 er Version gehen) ist notwendig, da mit WebMatrix zusammen nur ein SQL Server Compact installiert wird, dieser aber weder Views und Trigger noch Gespeicherte Prozeduren unterstützt, welche aber für den Betrieb von DotNetNuke zwingend notwendig sind.

Mit dem nächsten Klick auf OK, wird dann DotNetNuke (und  gegebenenfalls der SQL Server Express ) installiert.

Nun noch auf den URL Link  klicken und die DotNetNuke Installationsroutine wird gestartet.

Für den absoluten Neuling würde ich empfehlen beim ersten Kontakt mit DotNetNuke die Installations-Methode Auto zu verwenden (übrigens ist an dieser Stelle ein unfassbarer Übersetzung Klops zu sehen – Auto wird mit manuell übersetzt, ist doch logisch, oder 🙂 ). Bei dieser Option wird alles von der Installationsroutine vorbelegt und nach dem Klick auf Next ist alles getan und DotNetNuke wird mit Standardvorgaben installiert. Wer bereits mehr mit DotNetNuke, der Einrichtung der Anpassung zu tun hatte, kann auch mit den Optionen Typical und Custom arbeiten (experimentieren).

Nachdem DotNetNuke die Installtion abgeschlossen hat, sollten ganz viele Zeilen mit eine grünen Success im Browser erschienen sein und als letzte Zeile sollte ein

Click here to access your portal

erscheinen.

Dann „Click“ und viel Spaß!!


Wer sich die Installation lieber als Video anschaut kann das unter nachfolgendem Link (in Englisch) anschauen.
http://www.dotnetnuke.com/Resources/VideoLibrary/Viewer/TabId/1613/VideoId/174/Installing-DotNetNuke-With-WebMatrix.aspx

DotNetNuke Download Zähler – Wunsch oder Wahrheit ?

Ein Blick in den Seitenquellcode der Seite www.dotnetnuke.com zeigt den nachfolgenden Code:

<script type="text/javascript">
        var interval = .1;
        var counter, count = 0, updatedate;

        $(document).ready(function () {
                $.ajax({
                        type: "GET",
                        url: "/DesktopModules/Ticker/TickerXml.aspx",
                        dataType: "xml",
                        success: function (xml) {
                                $(xml).find("Ticker").each(function () {
                                        var $ticker = $(this);
                                        counter = $ticker.find('counter').text();
                                        updatedate = $ticker.find('updateddate').text();
                                });
                        }
                });

                if(typeof(counter) == "undefined") {
                        counter = 5568487;
                        updatedate = '10/20/2010 12:00:00 AM';
                }
                /*counter = 5408328;
                updatedate = '9/23/2010 1:38:40 PM';*/

                setTimeout(function () { getcounter(); }, 250);
                setInterval("getcounter();", interval * 60 * 1000);
        });

        function addCommas(number)
        {
                number += '';
                x = number.split('.');
                x1 = x[0];
                x2 = x.length > 1 ? '.' + x[1] : '';
                var rgx = /(\d+)(\d{3})/;
                while (rgx.test(x1))
                {
                        x1 = x1.replace(rgx, '$1' + ',' + '$2');
                }
                return x1 + x2;
        }

        function getcounter()
        {
                var currenttime = new Date();

                updatedate = new Date(Date.parse(updatedate));
                var seconds = calculate(updatedate, currenttime);
                var addedupdates = Math.floor(seconds / (60*interval));

                if (count == 0)
                {
                        count = counter;
                        count = parseInt(count) + parseInt(addedupdates);
                }
                counter = addCommas(count);

                var counterarray = counter.split(",");
                var  html = '';
                for(var  i=0; i<counterarray.length; i++)
                {
                        html += '<span>'+counterarray[i]+'</span>';
                }
                $(".downloadCounter").html('Over <strong>'+html+'</strong> Downloads');

                count++;
        }

        function calculate(update, current) {
                current = new Date(current);
                update = new Date(update);

                var sec = current.getTime() - update.getTime();
                if (isNaN(sec)) {
                        //alert("input data is incorrect!");
                        $(".downloadCounter").html('Over <strong>5</strong> <strong>500</strong> <strong>000</strong> Downloads');
                }

                var second = 1000, minute = 60 * second, hour = 60 * minute, day = 24 * hour;

                var days = Math.floor(sec / day);
                sec -= days * day;
                var hours = Math.floor(sec / hour);
                sec -= hours * hour;
                var minutes = Math.floor(sec / minute);
                sec -= minutes * minute;
                var seconds = Math.floor(sec / second);

                var totalsecond = seconds + (minutes * 60) + (60 * 60 * hours) + (60 * 60 * hours * days);
                return totalsecond;
        }
</script>

Hat DotNetNuke das wirklich nötig?

Wäre nicht eine andere (an der Wahrheit angelehnte) Lösung aufrichtiger !
Ich bin übrigens über diesen Twitter Beitrag auf diesen Umstand gestolpert, und konnte es eigentlich gar nicht glauben, bis…
… bis ich selbst kurz im Seitenquelltext nachgeschaut habe.

Damit auch Nicht Programmierer wissen was da steht, hier die Aufklärung:

Durch das Script wird ein Zähler erstellt, welcher die Anzahl Downloads alle 6 Sekunden um 1 erhöht. Egal ob tatsächlich Downloads stattgefunden haben, oder nicht.

Unbelievable