2010-11-10 7 views
7

Tengo un sitio que se implementa en más de una docena de clientes. El sitio web principal tiene una plantilla base y cada cliente tiene una carpeta de cliente que anula los colores. El problema es que hay muchos archivos CSS, por lo que llevar a cabo un cambio que nos obligue a actualizar cada cliente lleva mucho tiempo. El proceso de compilación automatizado se ocupa de reemplazar los archivos actualizados.Uso de C# para generar dinámicamente archivos CSS

Me gustaría cambiar los archivos CSS para que sean controles de usuario en su lugar, y esos controles de usuario podrían heredar de otro usuariocontrol donde se almacenan los valores específicos del cliente.

Así que, en lugar de tener un archivo forms.css y luego un archivo /client/forms.css, tendría un archivo Forms.ascx que hereda de un control de usuario que contiene los colores.

Ex:

<%@ Control Language="C#" ClassName="Forms" %> 
<%@ Register TagPrefix="css" TagName="Client" Src="~/css/ClientStyling.ascx" %> 

/* CSS Document */ 
body 
{ 
    color:<%=Client.BodyColor%> 
} 

Entonces el masterpage heredaría de la usercontrol lugar. Esto haría que el mantenimiento de los sitios del cliente sea mucho más fácil.

¿Es esta solución eficiente y recomendable? ¿O hay una mejor manera de lograr el mismo resultado final?

Si esto es posible, ¿también sería posible hacer que el control Forms.ascx produzca el marcado como CSS? O haga la extensión .css y aún tenga las propiedades ascx?

+0

¿Prevé que Client.BodyColor provenga de una base de datos o un archivo de configuración? –

+0

Sería difícil de codificar en un control de usuario. El proceso de construcción automatizado se encargaría de eso. –

Respuesta

11

En lugar de un control web, es mejor que cree un manipulador genérico. Esto no tendrá la sobrecarga que tiene un control web.

  1. En su controlador, aceptar la cadena de consulta a través de ClientId - Esto le permite almacenar en caché en un nivel de cliente
  2. En el archivo .master, se puede enlazar con él < enlace src = "MyCssHandler.ashx ClientID =? <% = ClientID%> ">

En su controlador tiene algunas formas de trabajar con CSS.

  1. Solo tienes un montón de respuestas.escriba para el CSS y coloque los valores relevantes del cliente
  2. Cree un archivo CSS externo con su propio identificador especial - tal vez <%%>. A continuación, puede cargar todos los valores específicos del cliente en una Colección NameValuePair, y luego recorrer el archivo CSS externo, analizar <% NAME%> y reemplazarlo con el valor correcto. Luego response.write este archivo. Más complicado cierto, pero permite un infierno de mucho más limpias archivos CSS
1

Escríbalo como un archivo y deja que el navegador lo recoja como lo haría con cualquier otro archivo CSS.

La creación de hojas de estilo en línea impide el mecanismo de caché del cliente, lo que obliga al CSS a publicarse en cada página.

+0

No quiero que el CSS esté en línea. Quiero que esté en un archivo .css separado que el navegador y el servidor almacenarán en caché. –

+1

Hojas de estilo en línea = ¡malo! –

1

Esto es completamente posible. Es posible que desee considerar la colocación en cascada de sus hojas de estilo también, de modo que la dinámica importa una estática (probablemente más grande).

Asp.NET tiene soporte para temas, también, pero para ser honesto, CSS es mucho más poderoso.

¿Por qué piensas en ASCX en lugar de ASPX? Pensé que, dado que un archivo css representa una respuesta completa, todo encajaría en una página.

un ashx es probablemente la forma más ligera, más rápida del controlador se puede implementar, por lo que puede que desee ver en que ...

Ah, y asegurarse de obtener los parámetros de almacenamiento en caché de la derecha!

7

Otra opción a considerar sólo puede ser el uso de un "compilador CSS" - como SASS, LESS o incluso HSS que puede soportar construcciones prácticos como "mixins" e incluyendo otros archivos. Este enfoque puede permitir un sistema que, aunque no sea dinámico, se pueda configurar fácilmente según las necesidades de sus diferentes clientes.

Por ejemplo, con un "compilador CSS" todo el esquema de color podrían almacenarse en un solo archivo como variables o plantillas exportables (depende de "compilador") - modificar ese archivo, "recompilación" ** y wham, la nueva interfaz de combinación de colores está en todas partes (SASS también admite matemática en colores, como cambio de matiz). Esto puede hacer que la implementación/administración del uso de contenido estático sea lo suficientemente factible para sus propósitos.

Uso SASS (se ajustaba a mis necesidades/estilo, mientras que LESS/HSS no). Me gustaría no volver atrás a menos que realmente, realmente tuviera que hacerlo (es decir: uhh, nunca) - SASS en modo SCSS también entiende la sintaxis CSS para que pueda microevolucionar o mezclar y combinar (LESS y HSS también funcionan así, pero HSS solo funciona con un subconjunto más estricto de sintaxis CSS). Los compiladores de CSS también se pueden usar conjuntamente con los motores de plantillas (como TT4) o aprovechar archivos generados dinámicamente (no dinámico-dinámicos como en la pregunta, pero dinámicos en el sentido de que provienen de alguna otra fuente de datos) si extra el poder es necesario

Mientras que la cascada de CSS normal y los nombres/selectores de clase pueden recorrer un largo camino, me resulta mucho más fácil separar la "cascada lógica" (CSS, donde CSS/cascading es vital) y "geeze, ojalá funcionó" como una plantilla "(compilador de CSS, que debe manejar casos en los que se abuse de CSS/cascadas).

** Tanto SASS como LESS pueden monitorear archivos y recompilarlos automáticamente. SASS incluso permite monitorear directorios completos

+0

Acabo de empezar a jugar con SASS. Lo estoy amando hasta ahora. –

Cuestiones relacionadas