2008-09-19 17 views

Respuesta

20

No sé si es el uso correcto, pero creo que se puede forzar una recarga del archivo CSS usando una cadena de consulta:

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

recuerdo que solía este método hace años para forzar una recarga de una imagen de cámara web de, pero el tiempo, probablemente ha pasado ...

0

Debería simplemente compartir una clase ancestro común, luego puede deslizarla con un solo comando js si fuera necesario.

<body class="style2"> 

<body class="style1"> 

etc.

4

Sin utilizar JS, sólo puede mantener el nombre del archivo CSS en una variable de sesión. Cuando se realiza una solicitud a la Página principal, simplemente redacta la etiqueta de enlace css con el nombre de la variable de sesión.

Siendo el nombre del archivo ccs diferente, fuerza al usuario a descargarlo sin necesidad de verificar lo que estaba previamente cargado en el navegador.

0

Sé que la pregunta era específicamente sobre C# y supongo que de ese servidor de Windows de algún sabor. Como no conozco bien ninguna de esas tecnologías, daré una respuesta que funcionará en PHP y Apache, y es posible que obtenga algo de ella.

Como se sugirió anteriormente, apenas se fija un ID o una clase sobre el cuerpo de la página depende de la consulta ejemplo específico (en PHP)

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

Y tu CSS puede apuntar a esto:

body#admin h1 { 
    color: red; 
} 

body#normal h1 { 
    color: blue; 
} 

etc

en cuanto a la obligatoriedad de CSS descarga, se puede hacer esto en Apache con los módulos mod_expires o mod_headers - para mod_headers, esto en .htaccess dejaría de archivos CSS siendo caché d:

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

Pero ya que probablemente no estás usando Apache, que no le ayudará mucho :(

1

respuesta para la pregunta 1

Se podría escribir un control de servidor heredar de System.Web.UI.Control que anula el Renderizar método:

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

    } 

} 

e insertar una instancia de esta clase en su MasterPage:

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

como jeroen suggested puede tener algo como:

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

Luego su StyleSelector.aspx debe ser algo como esto:

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

Y sus StyleSelector.aspx.cs así:

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

Esto enviaría al usuario el contenido de un archivo CSS (en realidad cualquier archivo, consulte Seguridad nota) en función de los argumentos de cadena de consulta. Ahora la parte difícil es hacer el GET Condicional, que es el nombre elegante para verificar si el usuario tiene la página en el caché o no.

Antes que nada, le recomiendo que lea HTTP Conditional GET for RSS hackers, un excelente artículo que explica los fundamentos del mecanismo HTTP Conditional GET. Es un debe leer, créanme.

He publicado un similar answer (pero con el código PHP, lo siento) a la pregunta SO can i use “http header” to check if a dynamic page has been changed. Debería ser fácil portar el código de PHP a C# (Lo haré si más tarde tengo el tiempo).

Nota de seguridad: es muy inseguro haciendo algo como ("css /" + cssFileName + ". css "), ya que puede enviar una cadena de ruta relativa y, por lo tanto, puede enviar al usuario el contenido de un archivo diferente. Debes encontrar una forma mejor de averiguar qué archivo CSS enviar.

Nota de diseño: en lugar de una página .aspx es posible que desee utilizar un IHttpModule o IHttpHandler, pero de esta manera funciona bien.

0

Me gusta la sugerencia de jeroen de agregar una cadena de consulta a la URL de la hoja de estilo. Puede agregar la marca de tiempo cuando se modificó por última vez el archivo de la hoja de estilo. Me parece un buen candidato para una función auxiliar o control personalizado que generaría la etiqueta LINK por usted.

Cuestiones relacionadas