Mein vorheriger Beitrag befasste sich mit der Verwendung von Magentos API mit WCF. Ein weiterer Aspekt von Magento, auf den ich gestoßen bin, ist die äußerst flexible Unterstützung für Themen.
Sie können ein neues Thema entwerfen, das sich radikal von der Standardeinstellung unterscheidet. Sie können nicht nur die Bilder und Farben in den Cascading -Stilblättern ändern, sondern auch die Regionen (Header, Inhalt, Fußzeile ...) neu definieren, aus denen eine Seite besteht. In der Region können Sie angeben, welche HTML in sie injiziert wird. Auf diese Weise erhalten Sie eine maximale Anpassungsleistung für die Themen Ihrer Website.
Das Thema in ASP.NET wird außerhalb des Boxs unterstützt. Mit dem Ordner app_themes können Sie das Erscheinungsbild Ihrer Website anpassen, wie umständlich dieses System ist.
Magento wird unter Verwendung des MVC -Musters erstellt, genau wie das ASP.NET -MVC -Framework. Und das ist der Schwerpunkt dieses Artikels. Wie gehen wir vor, um die Themen in ASP.NET MVC implementieren?
Lass uns anfangen ...
Bevor wir mit dem Codieren beginnen, fassen wir die Ziele zusammen, die wir erreichen möchten. Nehmen wir an, wir besitzen ein Unternehmen, das Möbel importiert, die in China, Vietnam, Süd-Korea hergestellt wurden, usw. Wir verkaufen nicht direkt an Endverbraucher, sondern an Wiederverkäufer.
Wir möchten eine ASP.NET-MVC-Webanwendung entwerfen, die von all unseren Wiederverkäufern als E-Commerce-Site verwendet werden kann. Jeder Reseller hat seinen eigenen Domainnamen und möchte seine Waren online verkaufen. Jede dieser Domänen ist mit unserer einzelnen Webanwendung verknüpft.
Die von der Webanwendung angebotene Funktionalität ist für jeden Wiederverkäufer gleich, aber jeder Reseller möchte seinen Online -Shop anpassen, indem er ein benutzerdefiniertes Thema anwendet. Wir werden die folgenden Situationen unterstützen:
Wir müssen also herausfinden, wie wir das Style Sheet (CSS), die Master -Seite, die Ansichten und die teilweisen Ansichten dynamisch ersetzen können.
Bevor wir anfangen können, müssen wir die Grundlage legen. Beginnen wir zunächst die Grundlagen für eine einfache Demo -Anwendung.
Bemerkung : In diesem Abschnitt gebe ich einen kurzen Überblick über das Einrichten einer Demo -Anwendung, damit die Themenfunktion demonstriert werden kann. Dies ist nur ein schneller und einfacher Ansatz. Der Schwerpunkt dieses Artikels liegt nicht darauf, wie ein Domänenmodell entworfen wird, Ihre Geschäftslogikschicht entworfen wird ... usw. Also halte ich das so kurz wie möglich. Fühlen Sie sich frei, es zu verbessern.
Datenbank
Erstellen Sie eine neue Datenbank mit SQL Server Express (2005 oder 2008). Inspiriert von der Northwind -Datenbank, die ich meine Datenbank [Winddirektion] benannte.
Diese Datenbank enthält genau eine Tabelle namens [Reseller]. Entwerfen Sie die Tabelle wie in der folgenden Abbildung gezeigt.
Abbildung 1 - [Reseller] Tabelle
![Wiederverkäufer -Tisch [Reseller] Table Design](https://images.downcodes.com/uploads/20250616/img_68500176a3ae030.png)
Wie Sie sehen können, ist die ID -Spalte der Primärschlüssel und verwendet die Identitätsspezifikation (= AutoIncrement). Fügen Sie auch eine eindeutige Einschränkung in der Domain -Spalte hinzu, da jeder Wiederverkäufer seine eigene eindeutige Domäne hat.
Bemerkung : Der Quellcode, der diesen Artikel begleitet, enthält ein Skript (DDL.SQL), mit dem Sie diese Tabelle schnell generieren können, wenn Sie sie nicht von Hand entwerfen möchten.
Der letzte Teil der Einrichtung unserer Datenbank besteht darin, einige Dummy -Datensätze für die Tabelle [Reseller] einzugeben. Bitte geben Sie die folgenden Datensätze ein:
Abbildung 2 - Wiederverkäufer

Wir haben vier Wiederverkäufer. Der erste Reseller hat kein benutzerdefiniertes Thema und fällt auf die Standardeinstellung zurück. Alle anderen haben ihr eigenes benutzerdefiniertes Thema definiert.
Starten Sie Visual Studio 2008 und erstellen Sie eine neue leere Lösung mit dem Titel "MVCApplication". Fügen Sie eine neue Code -Bibliothek hinzu und nennen Sie sie "cgeers.winddirection.database". Löschen Sie die automatisch generierte Class1.css -Datei.
Fügen Sie als nächstes einen neuen LINQ zu SQL -Klassenartikeln hinzu und nennen Sie es "DataClasses". Benennen Sie den neuen DataContext in "WinddirectionDatacontext" um. Ziehen Sie nun die Tabelle [Reseller] von der Registerkarte Server Explorer auf die LINQ auf SQL Designer -Oberfläche.
Abbildung 3 - Wiederverkäufer -Einheit

Legen Sie die Verbindungseigenschaft des DataContext auf "Keine" fest und löschen Sie die Einstellung für die Verbindungszeichenfolge und die Anwendungskonfigurationsdatei (app.config). Ich mag die Tatsache nicht, dass Visual Studio die Verbindungszeichenfolge für mich injiziert. Ich mache es gerne selbst.
Aus diesem Grund habe ich dieser Baugruppe die folgende Teilklasse hinzugefügt, die die Initialisierung des DataContext mit einer Verbindungszeichenfolge übernimmt. Der einzige Teil, auf den wir uns einig sind, ist, dass die Verbindungszeichenfolge als "Winddirektion" bezeichnet wird.
Listing 1 - WinddirectionDatacontext -Klasse
public partial class WindDirectionDataContext
{
private static readonly string ConnectionString ;
static WindDirectionDataContext ( )
{
ConnectionStringSettings settings = ConfigurationManager . ConnectionStrings [ "WindDirection" ] ;
ConnectionString = settings != null ? settings . ConnectionString : String . Empty ;
}
public WindDirectionDataContext ( ) : base ( ConnectionString ) { }
}Vergessen Sie nicht, einen Verweis auf das System zu hindern. Konfigurationsbaugruppe. Solange Sie eine Verbindungszeichenfolge mit dem Namen "Winddirektion" in die Anwendungen aufnehmen, die auf diese Baugruppe hinweisen, funktioniert sie gut.
Wir sind fast da. Halte einfach fest, wir werden es schaffen. Fügen Sie nun der Lösung "Cgeers.WindDDirection.Managers" eine neue Codebibliothek mit dem Namen "Cgeers.WindDirection.Managers" hinzu. Löschen Sie die automatisch generierte Class1.cs -Datei und fügen Sie eine Referenz zum System.data.linq Assembly hinzu.
Fügen Sie eine neue Klasse namens Manager hinzu und fügen Sie den folgenden Code hinzu:
Listing 2 - abstrakter Manager
public abstract class Manager
{
protected Manager ( )
{
Context = new WindDirectionDataContext ( ) ;
}
public WindDirectionDataContext Context { get ; set ; }
}Diese sehr einfache Klasse erstellt einen neuen DataContext, auf dem wir unsere LINQ -Abfragen später freisetzen können.
Fügen Sie als nächstes eine Klasse mit dem Namen "Resellermanager" zum Projekt hinzu und fügen Sie den in Listing 3 gezeigten Code hinzu.
Listing 3 Resellermanager
public class ResellerManager : Manager
{
public string GetThemeForDomain ( string domain )
{
var q = from r in Context . Resellers
where r . Domain == domain
select r . Theme ;
string theme = q . SingleOrDefault ( ) ;
return ! String . IsNullOrEmpty ( theme ) ? theme : "Default" ;
}
}Diese Managerklasse stammt von unserer abstrakten Managerklasse ab und fügt eine Methode namens GetThemeFordOmain (...) hinzu. Diese Methode sucht das Thema eines Wiederverkäufers nach einem bestimmten Domain -Namen. Da jede Domäne einzigartig mit einem Reseller gebunden ist, ist dies kein Problem.
Voila, das ist der gesamte Datenzugriff, der für unsere Demo -Anwendung benötigt wird. Wir müssen das Thema eines Wiederverkäufers basierend auf der Domäne der eingehenden Anfrage herausfinden, und dann müssen wir es anwenden.
Bemerkung : Halten Sie sich vor der Verwendung des LINQ zu SQL -Kontext in einer ASP.NET -Anwendung. Obwohl es in diesem Artikel nicht demonstriert ist, weil es zu sehr von unserem Hauptunterfangen ablenken würde, ist es ratsam, nur einen Kontext pro Anfrage zu erstellen. Speichern Sie den Kontext im HTTPContext der Anforderung, damit Sie während der Anfrage jederzeit darauf zugreifen können.
Vor einiger Zeit habe ich einen Artikel darüber geschrieben, dass ich den Artikel des Entity Framework ObjectContext hier lesen kann. Obwohl es sich mit dem Entity -Framework anstelle von linq zu SQL befasst, ist es immer noch anwendbar.
Der letzte Schritt bei der Ausführung unserer grundlegenden Demo -Anwendung ist der Hinzufügen eines neuen Website -Projekts zur Lösung. Fügen Sie der Lösung ein neues Projekt hinzu, das auf der Vorlage von ASP.NET MVC -Webanwendungsprojekt basiert, und nennen Sie es "MVCApplication". Sie werden gefragt, ob Sie auch ein Unit -Testprojekt für diese Anwendung erstellen möchten. Wählen Sie "Nein", um dies zu überspringen, da wir es für diesen Artikel nicht benötigen.
Visual Studio generiert eine "Hallo, Welt!"-Geben Sie eine ASP.NET-MVC-Anwendung ein, die eine Reihe von Standardseiten enthält (Home, etwa, anmelden ... usw.). Fügen Sie Ihre Verbindungszeichenfolge in die Datei web.config hinzu und fügen Sie Referenzen zu cgeers.winddirection.database und cgeers.WindDirection.managers Assemblys hinzu.
Bemerkung : Die Web.config enthält eine Reihe von Konfigurationseinstellungen, die sich auf die ASP.NET -Mitgliedschaft, das Profil, die Rollen ... Anbieter beziehen. Sie können diese löschen, da wir sie nicht brauchen.
Ihr Lösungs -Explorer sollte Abbildung 4 ähneln.
Abbildung 4 - Lösungsforscher

Bemerkung : Zum Zeitpunkt des Schreibens dieses Artikels verwende ich ASP.NET MVC Version 1.0. Version 2.0 wird jedoch in naher Zukunft veröffentlicht.
Wenn Sie die Webanwendung ausführen, muss das Thema als erstes herausgefunden werden, das sie bewerben muss. Dies muss für jede einzelne Anfrage erfolgen. Das Einstecken eines benutzerdefinierten HTTP-Moduls in die Anforderungspipeline scheint daher angemessen zu sein.
Fügen Sie dem MVCApplication -Projekt eine neue Klasse hinzu und nennen Sie es themaHttpModule. Lassen Sie die Klasse die IHTTPModule -Schnittstelle implementieren. Der gesamte Code für diese Klasse ist in Listing 4 angezeigt.
Dieser Artikel ist kein Grund zum Schreiben von HTTP -Modulen. Wenn Sie also weitere Informationen benötigen, lesen Sie bitte den Artikel "Walkthrough: Erstellen und Registrieren eines benutzerdefinierten HTTP -Moduls" zu MSDN.
Listing 4 - themenhttpmodule
public class ThemeHttpModule : IHttpModule
{
public void Init ( HttpApplication application )
{
application . BeginRequest += application_BeginRequest ;
}
private void application_BeginRequest ( object sender , EventArgs e )
{
HttpApplication application = ( HttpApplication ) sender ;
HttpContext context = application . Context ;
if ( context . Cache == null )
{
return ;
}
string domain = context . Request . Url . GetDomain ( ) ;
string cacheKey = String . Format ( CultureInfo . InvariantCulture , "theme_for_{0}" , domain ) ;
if ( context . Cache [ cacheKey ] == null )
{
ResellerManager manager = new ResellerManager ( ) ;
string theme = manager . GetThemeForDomain ( domain ) ;
context . Cache [ cacheKey ] = theme ;
}
}
public void Dispose ( ) { }
}Dieses HTTP -Modul fügt einen Event -Handler für das beginrequest -Event hinzu. Dieses Ereignis findet als erstes Ereignis in der HTTP -Pipeline -Ausführungskette statt, wenn ASP.NET auf eine Anfrage antwortet.
Hier extrahieren wir den Domänennamen aus der eingehenden Anfrage. Als nächstes holen wir das Thema für diese Domäne mit der GetTHemeFordOrdomain -Methode des Resellermanagers (...). Das Ergebnis wird dann zwischengespeichert. Wenn das nächste Mal eine Anfrage für diese Domäne ausgelöst wird, wird das Thema aus dem Cache abgerufen und keine Datenbankabfrage abgefeuert.
Die Methode GetDomain () ist eine Erweiterungsmethode für die URI -Klasse. Schauen Sie sich den Quellcode dieses Artikels an, um zu sehen, wie er funktioniert. In ähnlicher Weise könnten Sie sich dafür entscheiden, die Subdomäne (z. B. www, admin ... usw.) aus der Anfrage zu extrahieren. Sie können dann Ihre Themenmotor erweitern, um für jede Subdomäne einer Domäne verschiedene Themen anzuwenden.
Last but not least registrieren Sie das themenhttpmodule, indem Sie einen Eintrag in der Datei web.config erstellen. Dies ist erforderlich, um das HTTP-Modul mit den Request-Pipeline-Benachrichtigungen zu abonnieren.
Auflistung 5 - Registrieren Sie das themenhttpmodule
< httpModules >
< add name = " ThemeHttpModule " type = " MvcApplication.ThemeHttpModule " />
<!-- ... -->
</ httpModules >Wenn Sie die Webanwendung starten, erhalten Sie das in Abbildung 5 angezeigte Standard -Look & Feel. Wir werden diese Dateien verwenden, um unser Standardthema auszugleichen.
Abbildung 5 - Standardthema ASP.NET MVC Application

Standardmäßig werden alle Dateien in den Ordnern des Inhalts- und Ansichten gespeichert. Wir müssen unsere eigene Verzeichnisstruktur implementieren, damit wir unsere Themen logisch gruppieren können. Erstellen Sie daher einen neuen Ordner namens Themes. Erstellen Sie einen Unterordner für das Themenverzeichnis und nennen Sie ihn Standard. Verschieben Sie das Verzeichnis des Inhalts und sehen Sie sich das Verzeichnis in diesem Standardverzeichnis an.
Nach dem Verschieben der Ordner in den Inhalten und Ansichten müssen Sie die Eigenschaft der Meisterpage für die Seitenanweisung für jede der Ansichten einstellen! Der alte Wert bezieht sich auf einen Ort, an dem es nicht mehr existiert. Ändern Sie masterpageFile = "~/views/Shared/ Site
Abbildung 6 - Standardthema

Voila, unser Standardthema wurde eingerichtet. Wenn Sie ein neues Thema erstellen möchten, müssen Sie nur einen neuen Ordner erstellen und in den Ordner "Themes" platzieren. Wie Sie im vorherigen Screenshot sehen können, erstellen wir später einige andere Themen (grün, orange, rot).
Wir haben gerade unsere Master -Seiten, Stilblätter, Ansichten ... usw. verschoben. zu einem anderen Verzeichnis. Wenn wir jetzt unsere Webanwendung starten, erhalten wir die folgende Ausnahme:
Abbildung 7 - InvalidoperationException

Die Ansicht 'Index' oder sein Meister konnte nicht gefunden werden. Die folgenden Orte wurden durchsucht:
MVC versucht, eine Ansicht für Ihre Standard -Startseite zu finden, kann sie jedoch nicht an den Standardorten finden, in denen Sie sucht, sodass Sie eine Ausnahme erhalten. Wir haben diese Dateien in unseren Standard -Themenordner verschoben und bald erstellen wir andere Themen. Wir brauchen eine Möglichkeit, MVC über die Orte zu informieren, an denen nach ihren Ansichten, Master -Seite, teilweise Ansichten ... usw. Diese Standorte unterscheiden sich vom Thema des Wiederverkäufers.
Grundsätzlich müssen wir also nur tun, um die Themen in ASP.NET MVC zu unterstützen, ist:
Dazu müssen wir unsere eigene Sichtmotor schreiben. MVC verwendet eine View -Engine, um Seiten für die Antwort zu rendern. Diese Ansichtsmotor ist dafür verantwortlich, die Masterseite, die Ansichten und die teilweisen Ansichten zu finden. Standardmäßig wird die WebFormViewEngine verwendet.
Wir müssen diese Standard -Ansichtsmotor durch unsere eigene ersetzen. Fügen Sie dazu eine neue Klasse namens themedViewEngine zum MVCApplication -Projekt hinzu und lassen Sie sie von der WebformViewEngine -Klasse absteigen.
Listing 6 - ThemeDViewEngine
public class ThemedViewEngine : WebFormViewEngine
{
#region Constructor(s)
// Replace the default search paths by our own.
public ThemedViewEngine ( )
{
// Search paths for the master pages
base . MasterLocationFormats = new [ ]
{
"~/Themes/{2}/Views/{1}/{0}.master" ,
"~/Themes/{2}/Views/Shared/{0}.master"
} ;
// Search paths for the views
base . ViewLocationFormats = new [ ]
{
"~/Themes/{2}/Views/{1}/{0}.aspx" ,
"~/Themes/{2}/Views/{1}/{0}.ascx" ,
"~/Themes/{2}/Views/Shared/{0}.aspx" ,
"~/Themes/{2}/Views/Shared/{0}.ascx" ,
} ;
// Search parts for the partial views
// The search parts for the partial views are the same as the regular views
base . PartialViewLocationFormats = base . ViewLocationFormats ;
}
#endregion
}Im Konstruktor dieser neuen Ansichts -Engine setzen wir die MasterlocationFormats, ViewLocationFormats und PartialViewLocationFormats auf neue Positionen, z. B. ~/Themes/{2}/Views/{1}/{0} .aspx.
Jeder Pfad enthält 3 Teile, die dynamisch bestimmt werden.
Um die neue Ansichtsmotor zu verwenden, müssen Sie sie registrieren. Tun Sie dies durch den folgenden Code zum Ereignishandler von Application_Start in der Datei Global.asax.cs.
Listing 7 - Registrieren Sie die ThemeedViewEngine
protected void Application_Start ( )
{
ViewEngines . Engines . Clear ( ) ;
ViewEngines . Engines . Add ( new ThemedViewEngine ( ) ) ;
RegisterRoutes ( RouteTable . Routes ) ;
}Hier löschen Sie alle Ansichtsmotoren, die möglicherweise früher geladen wurden und Ihre eigenen injizieren. Jetzt bleibt nur noch die Ansicht, dass die Ansichtsmotor die neuen Suchpfade so formatieren, dass sie die angeforderten Dateien korrekt findet. Dazu müssen Sie die folgenden zwei Methoden überschreiben:
Listing 8 - findPartialView (...) & findView (...) Methoden
public override ViewEngineResult FindPartialView ( ControllerContext controllerContext , string partialViewName , bool useCache )
public override ViewEngineResult FindView ( ControllerContext controllerContext , string viewName , string masterName , bool useCache )Ich werde den Code für diese beiden Funktionen hier nicht aufnehmen, da er ziemlich langwierig ist und ein paar Verweise auf private Helfermethoden hat. Grundsätzlich folgen diese beiden Methoden dem gleichen Muster:
Unsere neue Ansichts -Engine durchsucht also im Grunde unseren Themenordner und wenn sie nicht die angeforderte Masterseite, die Ansicht oder die teilweise Ansicht finden kann, wird das des Standardthemas verwendet. Natürlich muss das Standardthema vollständig sein und keine fehlenden Dateien haben.
Auf diese Weise können Sie Themen erstellen, die nur eine Master -Seite enthalten, die wiederum auf ein anderes Stilblatt oder Themen verweist, die Ansichten und / oder teilweise Ansichten für nur die Abschnitte enthalten, die Sie anders stylen möchten.
Wenn Sie diesem Muster folgen, können Sie Themen erstellen, die nur bestimmte Ansichten überschreiben und auf die Ansichten des Standardthemas zurückgreifen, wenn keine benutzerdefinierte Ansicht angegeben ist.
Ich habe meine Sichtmotor auf die Arbeit von Chris Pietschmanns ausgezeichnetem Artikel über die Tatsache in ASP.NET MVC gestützt. Ich schlage vor, Sie überprüfen seinen Artikel, da er weitere Informationen darüber enthält, wie die Ansichtsmotor intern funktioniert.
Mit der neuen Ansichts -Engine können wir die Webanwendung ohne Ausnahmen erneut ausführen, da sie nun die Anfragen für die Masterseite, die Ansichten und die teilweisen Ansichten beheben können.
Bemerkung : Ich habe den Code ein wenig geändert, so dass die Ansichtsmotor eine Anforderung für eine bestimmte Masterseite, Ansicht oder teilweise Ansicht auf diejenigen zurückgreift, die im Standardthema gefunden wurden. Schauen Sie sich also auch den Quellcode dieses Artikels an.
Lassen Sie uns schnell ein neues Thema erstellen. Fügen Sie einen neuen Ordner namens "Red" im Ordner "Themen" hinzu. Kopieren Sie die Site.Master und Site.css aus dem Standardthema, wie in der folgenden Abbildung gezeigt.
Abbildung 8 - Rotes Thema

Öffnen Sie das Stilblatt des roten Themas und ändern Sie die Hintergrund-Farbeneigenschaft des Körperelements. Stellen Sie es auf rot ein. Öffnen Sie nun die Tabelle [Reseller] und setzen Sie das Thema "rot" für den Wiederverkäufer, dessen Domäne auf Localhost festgelegt ist. Starten Sie die Webanwendung neu und sie sollte nun die Masterseite und das Stilblatt des roten Themas verwenden.
Abbildung 9 - Rotes Thema in Aktion

Ebenso können Sie ein orangefarbenes Thema erstellen, das nicht nur eine Master -Seite, sondern auch eine andere Ansicht für die Startseite enthält.
Abbildung 10 - orangefarbenes Thema

Das orangefarbene Thema wird die neue Ansicht für die Startseite anstelle der Standardansicht übertragen. Wenn Sie eine teilweise Ansicht ersetzen möchten, können Sie dies auf die gleiche Weise tun. Kopieren Sie einfach die Standardansicht in denselben Ort unter dem neuen Themenordner und passen Sie sie nach Bedarf an.
Für jedes Thema sind Sie jetzt in der Lage, verschiedene Master -Seiten, -ansichten und teilweise Ansichten zu servieren. Es gibt ein verbleibendes Szenario, das ich unterstützen möchte. Wiederverkäufer, die mit der Standardansicht zufrieden sind, aber nur das Logo, einige Farben ... usw. anpassen möchten. kann leicht zufrieden sein, indem ein anderes Stylesheet auf das Standardthema angewendet wird.
Fügen Sie einen neuen Themenordner in das Themenverzeichnis hinzu und nennen Sie es grün. Kopieren Sie das Stilblatt des Standardthemas in das grüne Thema, wie in der folgenden Abbildung gezeigt.
Abbildung 11 - Grünes Thema

Öffnen Sie das Stilblatt des grünen Themas und passen Sie die Hintergrundfarbe des Körperelements an grün an. Wenn Sie das Thema für den Wiederverkäufer mit der Domain Localhost auf Grün einstellen und die Anwendung starten, werden Sie feststellen, dass er noch das Stylesheet des Standardthemas verwendet.
Dies wird durch die Tatsache verursacht, dass das grüne Thema keine eigene Master -Seite hat. Es verwendet die Masterseite des Standardthemas und diese Masterseite verweist auf ein eigenes Stilblatt.
Öffnen Sie die Masterseite des Standardthemas und ersetzen Sie die Zeile:
< link href =" ../../Content/Site.css " rel =" stylesheet " type =" text/css " />mit
< link href =" <% " ="Html.GetThemedStyleSheet()" % /> rel="stylesheet"
type="text/css" / >Die Methode GetTHemedStylesheet () ist eine Erweiterungsmethode für die HTML -Dienstprogrammklasse. Fügen Sie dem Projekt eine neue Klasse namens HTMLHelPerextinsions hinzu und fügen Sie den folgenden Code hinzu.
Listing 9 - htmlHelPerextinsionen
public static class HtmlHelperExtensions
{
public static string GetThemedStyleSheet ( this HtmlHelper html )
{
HttpContext context = HttpContext . Current ;
if ( context == null )
{
throw new InvalidOperationException ( "Http Context cannot be null." ) ;
}
string defaultStyleSheet = context . Server . MapPath ( "~/Themes/Default/Content/Site.css" ) ;
string domain = context . Request . Url . GetDomain ( ) ;
string cacheKey = String . Format ( CultureInfo . InvariantCulture , "theme_for_{0}" , domain ) ;
string theme = ( string ) context . Cache [ cacheKey ] ;
if ( String . IsNullOrEmpty ( theme ) || theme == "Default" )
{
return defaultStyleSheet ;
}
string styleSheet = context . Server . MapPath ( String . Format ( CultureInfo . InvariantCulture ,
"~/Themes/{0}/Content/Site.css" , theme ) ) ;
if ( ! File . Exists ( styleSheet ) )
{
styleSheet = defaultStyleSheet ;
}
return String . Format ( CultureInfo . InvariantCulture , "'{0}'" , styleSheet ) ;
}
}Die GetTHemedStylleSheet () -Methode lädt das Thema aus dem Cache und Überprüfungen des HttPapplication -Cache und der Überprüfung, ob dieses Thema ein eigenes Stilblatt hat. Wenn nicht, fällt es auf das Stilblatt des Standardthemas zurück. Der Code enthält einige hartcodierte Zeichenfolgen, obwohl er nicht optimal ist, er macht den Trick. Fühlen Sie sich frei, diese Methode zu verbessern.
Wenn Sie jetzt die Webanwendung starten, erhalten Sie einen schönen grünen Hintergrund.
Dieser Artikel zeigt, wie Sie die Themen in ASP.NET MVC aktivieren können. Um dies zu tun, müssen Sie nur zwei Dinge implementieren, nämlich:
Das von uns implementierte Themensystem verwendet ein Standardthema und überprüft, ob es Teile dieses Standardthemas durch das eines benutzerdefinierten Themas ersetzen muss. Sie können leicht eines der folgenden Szenarien unterstützen oder diese kombinieren: