Verwenden von C # zum dynamischen Generieren von CSS-Dateien

7

Ich habe eine Website, die für mehr als ein Dutzend Clients bereitgestellt wird. Die Hauptwebsite verfügt über eine Basisvorlage, und jeder Client verfügt über einen Clientordner, der die Farben überschreibt. Das Problem ist, dass es viele CSS-Dateien gibt, so dass eine Änderung, die uns dazu zwingt, jeden Client zu aktualisieren, sehr lange dauert. Der automatisierte Buildprozess sorgt dafür, dass die aktualisierten Dateien ersetzt werden.

Ich möchte die CSS-Dateien stattdessen zu usercontrols ändern, und diese Benutzersteuerelemente könnten dann von einem anderen Benutzersteuerelement erben, in dem clientspezifische Werte gespeichert sind.

Anstatt eine forms.css-Datei und dann eine / client / forms.css-Datei zu haben, würde ich eine Forms.ascx-Datei haben, die von einem Benutzer-Steuerelement erbt, das die Farben enthält.

Beispiel:

%Vor%

Dann würde die Masterseite stattdessen von der Benutzersteuerung erben. Dies würde die Pflege der Client-Sites viel einfacher machen.

Ist diese Lösung also effizient und empfehlenswert? Oder gibt es einen besseren Weg, um das gleiche Endergebnis zu erzielen?

Wenn dies möglich ist, wäre es auch möglich, dass das Forms.ascx-Steuerelement das Markup als CSS ausgibt? Oder machen Sie die Erweiterung .css und haben immer noch die Ascx-Eigenschaften?

    
S.Kiers 10.11.2010, 17:45
quelle

4 Antworten

11

Anstelle eines Web-Controls ist es wahrscheinlich besser, einen generischen Handler zu erstellen. Dies hat nicht den Overhead, den ein Web-Steuerelement hat.

  1. Akzeptieren Sie in Ihrem Handler die clientID über querystring - damit können Sie auf Client-Ebene cachen
  2. In Ihrer .master-Datei können Sie eine Verknüpfung zu & lt; link src="MeinCssHandler.ashx? ClientID = & lt;% = ClientID% & gt;" & gt;

In Ihrem Handler haben Sie einige Möglichkeiten, mit dem CSS zu arbeiten.

  1. Habe einfach eine Menge response.write für die CSS und lege relevante Client-Werte ein
  2. Erstellen Sie eine externe CSS-Datei mit einem eigenen speziellen Bezeichner - vielleicht & lt;%% & gt ;. Sie können dann alle clientspezifischen Werte in eine NameValuePair-Sammlung laden und dann die externe CSS-Datei durchlaufen, indem Sie & lt;% NAME% & gt; und Ersetzen mit dem richtigen Wert. Dann response.write diese Datei. Etwas komplizierter, aber es ermöglicht eine Menge sauberer CSS-Dateien
Prescott 10.11.2010, 18:00
quelle
7

Eine andere Option, die in Betracht gezogen werden kann, besteht darin, einen "CSS-Compiler" zu verwenden - wie zB SASS , LESS oder sogar HSS , die möglicherweise handliche Konstrukte wie" Mixins "und" including "unterstützen andere Dateien. Dieser Ansatz ermöglicht möglicherweise ein System, das zwar nicht dynamisch ist, aber leicht auf die Bedürfnisse des jeweiligen Kunden konfigurierbar ist.

Zum Beispiel könnte mit einem "CSS-Compiler" das gesamte Farbschema als exportierbare Variablen oder Templates in einer Datei gespeichert werden (abhängig vom "Compiler") - diese Datei modifizieren, "neu kompilieren" "** und wham, eine neue Farbschema-Schnittstelle gibt es überall (SASS unterstützt auch Mathe bei Farben - wie zum Beispiel Farbtonverschiebung). Dies kann die Bereitstellung / Verwaltung der Verwendung von statischem Inhalt für Ihre Zwecke ausreichend machen.

Ich benutze SASS (es passt zu meinen Bedürfnissen / Stil, während LESS / HSS nicht). Ich würde nicht zurückschalten , es sei denn, ich musste wirklich, wirklich (das heißt: ähh, nie) - SASS im SCSS-Modus versteht auch CSS-Syntax, so dass Sie sich weiterentwickeln oder mischen und anpassen können ( LESS und HSS funktionieren auch so, aber HSS arbeitet nur mit einer strengeren Teilmenge der CSS-Syntax. CSS-Compiler können auch in Verbindung mit Vorlagen-Engines (wie TT4) verwendet werden oder nutzen dynamisch generierte Dateien (nicht dynamisch-dynamisch wie in der Frage, aber dynamisch in dem Sinne, dass sie von einer anderen Datenquelle stammen) Macht wird benötigt.

Während nur normale CSS-Kaskadierung und Klassennamen / Selektoren sehr weit gehen können, finde ich es viel einfacher, die "logische Kaskade" zu trennen (CSS, wo CSS / Kaskadierung lebenswichtig ist) und "geeze, ich wünschte, dies würde funktionieren eine Vorlage "(CSS-Compiler, der Fälle behandeln soll, in denen CSS / Kaskadierung missbraucht wird).

** Sowohl SASS als auch LESS können Dateien automatisch überwachen und neu kompilieren. SASS erlaubt sogar die Überwachung ganzer Verzeichnisse

    
user166390 10.11.2010 18:13
quelle
1

Schreiben Sie es als Datei aus und lassen Sie es vom Browser wie jede andere CSS-Datei aufnehmen.

Das Erstellen von Inline-Stylesheets verhindert den Client-Cache-Mechanismus und zwingt Ihr CSS, mit jeder Seite bedient zu werden.

    
quelle
1

Das ist durchaus möglich. Vielleicht möchten Sie auch Ihre Stylesheets kaskadieren, damit die dynamische eine (vermutlich größere) statische importiert.

Asp.NET unterstützt auch Themen, aber um ehrlich zu sein, CSS ist viel mächtiger.

Warum denkst du ASCX anstelle von ASPX? Ich hätte gedacht, dass, da eine CSS-Datei eine ganze Antwort darstellt, alles in eine Seite passen könnte.

Ein Ashx ist wahrscheinlich die leichteste und schnellste Form von Handlern, die Sie implementieren können, also sollten Sie sich das mal ansehen ...

Ach, stell sicher, dass du deine Caching-Parameter richtig findest!

    
Rob Fonseca-Ensor 10.11.2010 17:59
quelle

Tags und Links