2008-09-19 3 views

Répondre

20

Je ne sais pas s'il est bon usage, mais je pense que vous pouvez forcer un rechargement du fichier css en utilisant une chaîne de requête:

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

Je me souviens que j'utilisé cette méthode il y a quelques années pour forcer un rechargement d'une image web cam, mais le temps a probablement évolué ...

0

Vous devriez peut-être simplement partager une classe d'ancêtre commune, alors vous pouvez la faire glisser avec une seule commande js si besoin est.

<body class="style2"> 

<body class="style1"> 

etc.

4

Sans utiliser js, vous pouvez juste garder le nom de fichier dans une variable css de session. Quand une demande est faite à la page principale, vous composez simplement la balise de lien css avec le nom de la variable de session. Étant donné que le nom du fichier ccs est différent, vous forcez le broswer à le télécharger sans avoir besoin de vérifier ce qui a été précédemment chargé dans le navigateur.

0

Je sais que la question était spécifiquement sur C# et je suppose de ce Windows Server de quelque saveur. Comme je ne connais pas bien l'une ou l'autre de ces technologies, je vais vous donner une réponse qui fonctionnera en PHP et Apache, et vous y trouverez peut-être quelque chose.

Comme suggéré précédemment, juste définir une carte d'identité ou d'une classe sur le corps de la page en fonction de la par exemple de requête spécifique (en PHP)

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

Et votre CSS peut cibler ceci:

body#admin h1 { 
    color: red; 
} 

body#normal h1 { 
    color: blue; 
} 

etc

en ce qui concerne le forçage de télécharger CSS, vous pouvez le faire dans Apache avec les modules mod_expires ou mod_headers - pour mod_headers, ceci .htaccess arrêterait les fichiers de cache étant css d:

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

Mais puisque vous n'êtes probablement pas en utilisant apache, cela ne vous aidera pas beaucoup :(

1

réponse pour la question 1

Vous pouvez écrire un contrôle Server héritant de System.Web.UI.Control remplaçant la méthode Render:

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\" />") 

    } 

} 

et insérez une instance de cette classe dans votre MasterPage:

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

comme jeroen suggested vous pouvez avoir somthing comme:

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

Ensuite, votre StyleSelector.fichier ASPX doit être quelque chose comme ceci:

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

Et vos StyleSelector.aspx.cs comme ceci:

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"); 
     } 
    } 
} 

Cela enverrait l'utilisateur le contenu d'un fichier CSS (en fait tout fichier, voir la sécurité note) en fonction des arguments de chaîne de requête. Maintenant, la partie difficile est de faire le GET conditionnel, qui est le nom de fantaisie pour vérifier si l'utilisateur a la page dans le cache ou non.

Tout d'abord je vous recommande fortement de lire HTTP Conditional GET for RSS hackers, un excellent article qui explique les bases du mécanisme HTTP GET conditionnel. C'est un doit lire, croyez-moi.

J'ai posté un similar answer (mais avec du code PHP, désolé) à la question SO can i use “http header” to check if a dynamic page has been changed. Il devrait être facile de porter le code de PHP vers C# (je le ferai si plus tard j'ai le temps.)

Note de sécurité: il est très peu sûr de faire quelque chose comme ("css /" + cssFileName + ". css "), car vous pouvez envoyer une chaîne de chemin relatif et ainsi vous pouvez envoyer à l'utilisateur le contenu d'un fichier différent. Vous devez trouver un meilleur moyen de savoir quel fichier CSS envoyer. Note de conception: au lieu d'une page .aspx, vous pouvez utiliser un IHttpModule ou un IHttpHandler, mais cela fonctionne très bien.

0

J'aime la suggestion de jeroen d'ajouter une chaîne de requête à l'URL de la feuille de style. Vous pouvez ajouter l'horodatage lors de la dernière modification du fichier de feuille de style. Cela me semble être un bon candidat pour une fonction d'assistance ou un contrôle personnalisé qui génèrerait la balise LINK pour vous.