2008-09-19 3 views
8

Gibt es eine Möglichkeit zu überprüfen, ob der Benutzer eine andere Version des CSS hat, die von seinem Browser zwischengespeichert wird, und wenn das der Fall ist, den Browser zwingen, die neue Version zu ziehen?Browser zwingen, neues CSS zu verwenden

Antwort

20

Ich weiß nicht, ob es richtig Nutzung ist, aber ich denke, Sie einen Abfrage-String mit einem Neuladen der CSS-Datei erzwingen:

<link href="mystyle.css?SOME_UNIQUE_TEXT" type="text/css" rel="stylesheet" /> 

ich erinnere mich, ich diese Methode Jahre vor einem erneuten Laden eines Web-Kamera im Bild zu zwingen, aber die Zeit auf wahrscheinlich bewegt hat ...

0

Sie sollten möglicherweise nur eine gemeinsame Vorfahrklasse verwenden, dann können Sie sie bei Bedarf mit einem einzigen js-Befehl umschalten.

<body class="style2"> 

<body class="style1"> 

usw.

4

Ohne js zu verwenden, können Sie einfach weiter die CSS Dateinamen in einer Sitzungsvariablen. Wenn eine Anfrage an die Hauptseite gestellt wird, erstellen Sie einfach das CSS-Link-Tag mit dem Namen der Sitzungsvariablen.

Da der ccs-Dateiname unterschiedlich ist, erzwingen Sie den Download des Broswer, ohne zu überprüfen, was zuvor im Browser geladen wurde.

0

Ich weiß, die Frage war speziell über C# und ich vermute von diesem Windows Server von etwas Geschmack. Da ich keine dieser Technologien gut kenne, gebe ich eine Antwort, die in PHP und Apache funktioniert, und Sie können etwas davon bekommen.

Wie bereits weiter oben erwähnt, stellen nur eine ID oder eine Klasse auf dem Körper der Seite abhängig von der spezifischen Abfrage zB (in PHP)

<?php 
if($_GET['admin_page']) { 
    $body_id = 'admin'; 
} else { 
    $body_id = 'normal'; 
} 
?> 
... 
<body id="<?php echo $body_id; ?>"> 
... 
</body> 

Und Ihre CSS kann Ziel dieses:

body#admin h1 { 
    color: red; 
} 

body#normal h1 { 
    color: blue; 
} 

etc

Wie für die CSS-Download zwingen, könnten Sie dies mit dem mod_expires oder mod_headers Module in Apache tun - für mod_headers, würde dies in .htaccess-Cache ist CSS-Dateien stoppen d:

<FilesMatch "\.(css)$"> 
Header set Cache-Control "max-age=0, private, no-store, no-cache, must-revalidate" 
</FilesMatch> 

Aber da Sie wahrscheinlich nicht Apache verwenden, dass Sie nicht viel helfen :(

1

Antwort zu Frage 1

Sie einen Server Control schreiben könnte erben von System.Web.UI.Control über die Render Methode:

public class CSSLink : System.Web.UI.Control 
{ 

    protected override void Render(System.Web.UI.HtmlTextWriter writer) 
    { 

     if (... querystring params == ...) 
      writer.WriteLine("<link href=\"/styles/css1.css\" type=\"text/css\" rel=\"stylesheet\" />") 
     else 
      writer.WriteLine("<link href=\"/styles/css2.css\" type=\"text/css\" rel=\"stylesheet\" />") 

    } 

} 

und eine Instanz dieser Klasse in Ihrem Masterpage einfügen:

<%@ Register TagPrefix="mycontrols" Namespace="MyNamespace" Assembly="MyAssembly" %> 
... 
<head runat="server"> 
    ... 
    <mycontrols:CSSLink id="masterCSSLink" runat="server" /> 
</head> 
... 
2

Als jeroen suggested Sie haben ungefähr wie:

<link href="StyleSelector.aspx?foo=bar&baz=foz" type="text/css" rel="stylesheet" /> 

Dann Ihr StyleSelector.aspx-Datei sollte wie folgt sein:

<%@ Page Language="cs" AutoEventWireup="false" Inherits="Demo.StyleSelector" Codebehind="StyleSelector.aspx.cs" %> 

Und Ihre StyleSelector.aspx.cs wie folgt aus:

using System.IO; 

namespace Demo 
{ 
    public partial class StyleSelector : System.Web.UI.Page 
    { 
     public StyleSelector() 
     { 
      Me.Load += New EventHandler(doLoad); 
     } 

     protected void doLoad(object sender, System.EventArgs e) 
     { 
      // Make sure you add this line 
      Response.ContentType = "text/css"; 

      string cssFileName = Request.QueryString("foo"); 

      // I'm assuming you have your CSS in a css/ folder 
      Response.WriteFile("css/" + cssFileName + ".css"); 
     } 
    } 
} 

Dies würde dem Benutzer den Inhalt einer CSS-Datei senden (eigentlich jede Datei, siehe Sicherheit Hinweis) basierend auf Abfragezeichenfolgenargumenten. Jetzt ist der schwierige Teil das Bedingte GET, das der fantastische Name ist, um zu überprüfen, ob der Benutzer die Seite im Cache hat oder nicht.

Zuallererst empfehle ich Ihnen lesen HTTP Conditional GET for RSS hackers, ein großer Artikel, der die Grundlagen des HTTP Conditional GET-Mechanismus erklärt. Es ist ein muss lesen, glaube mir.

Ich habe eine similar answer (aber mit PHP-Code, sorry) auf die SO-Frage can i use “http header” to check if a dynamic page has been changed geschrieben. Es sollte einfach sein, den Code von PHP nach C# zu portieren (ich mache es, wenn ich später Zeit habe).

Sicherheitshinweis: Es ist sehr unsicher, etwas wie ("css /" + cssFileName + "zu tun. css "), da Sie möglicherweise eine relative Pfadzeichenfolge senden und dem Benutzer den Inhalt einer anderen Datei senden können. Sie müssen sich überlegen, welche CSS-Datei gesendet werden soll.

Design Hinweis: anstelle einer .aspx Seite möchten Sie vielleicht eine IHttpModule oder IHttpHandler verwenden, aber dieser Weg funktioniert gut.

0

Ich mag Jeroen Vorschlag, eine Querystring der Stylesheet-URL hinzuzufügen. Sie könnten den Zeitstempel hinzufügen, wenn die Stylesheet-Datei zuletzt geändert wurde. Es scheint mir ein guter Kandidat für eine Hilfsfunktion oder ein benutzerdefiniertes Steuerelement zu sein, das das LINK-Tag für Sie generieren würde.