2012-07-20 25 views
14

Acabo de empezar a trabajar con VS 2012 RC. Creé un sitio de prueba con una página maestra y un formulario web único. Actualmente, estoy usando este código para agrupar toda la carpeta Styles en el sitio:Visual Studio 2012 Conditional Bundling

Global.asax

BundleTable.Bundles.EnableDefaultBundles(); 

Site.Master

<link rel="stylesheet" type="text/css" href="Styles/css" /> 

Pregunta: El sitio de prueba tiene un archivo CSS de nivel de sitio que controla el aspecto general del sitio. Además del CSS a nivel de sitio, cada página podría tener sus propias definiciones de CSS. ¿Es posible incluir solo el archivo site.css en la página maestra y, a continuación, agregar condicionalmente archivos .css al paquete como lo requiere cada página?

He intentado esto en el código detrás de Default.aspx pero no funcionó:

BundleTable.Bundles.Add(new Bundle("~/Styles/Default.css")); 
+0

Si sólo está cargando site.css en master y luego un archivo css página, entonces ¿por qué estás empaquetando? –

+0

@TimBJames, I * estaba * cargando el contenido de la carpeta completa.Me gustaría cargar solo el CSS a nivel del sitio en la página maestra y luego agrupar los archivos CSS adicionales según sea necesario. –

+0

leyendo esto por primera vez. ¿Esto no derrota el propósito de la agrupación? Después de todo, sin empaquetar cargaría site.css y page1.css en la primera carga, luego, cuando vaya a la página 2 solo cargará page2.css, page3.css para la página 3, etc. Asumiendo que los archivos CSS específicos de la página suelen ser mucho más pequeños que el sitio general, con la agrupación que se carga un archivo grande diferente en cada página, y sin empaquetar cargaría un pequeño archivo en cada página, solo la mejora sería la primera página donde cargar 1 archivo en lugar de 2 (mismo tamaño total) – Rodolfo

Respuesta

7

Mi sugerencia:

Goto Global.asax. Asegúrese de que el método de Application_Start contiene siguiente línea:

protected void Application_Start() 
{ 
    ... 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
} 

encontrar o crear la clase BundleConfig de la siguiente manera, de preferencia en la carpeta App_Start:

public class BundleConfig 
{ 
    public static void RegisterBundles(BundleCollection bundles) 
    { 
     ... 

     bundles.Add(new StyleBundle("~page1").Include(
      "~/Styles/site.css", 
      "~/Styles/page1.css")); 

     bundles.Add(new StyleBundle("~page2").Include(
      "~/Styles/site.css", 
      "~/Styles/page2.css")); 

     ... 

     bundles.Add(new StyleBundle("~pageN").Include(
      "~/Styles/site.css", 
      "~/Styles/pageN.css")); 

    } 
} 

Ahora use haz correspondiente en cada página correspondiente:

<link rel="stylesheet" type="text/css" href="Styles/page1" /> 

O mejor del código:

@Styles.Render("~/Styles/page1") 

(esto es cshtml, pero la sintaxis de aspx es muy similar).

Tenga en cuenta que debe tener un paquete separado por página. No debe modificar uno y el mismo paquete sobre la marcha. Los paquetes tienen Urls virtuales. En su ejemplo, es solo css. Estos son almacenados en caché por los navegadores, por lo que, independientemente del tiempo en que hayas cambiado el contenido del paquete sobre la marcha, un navegador puede pensar que es el mismo y no volver a buscarlo.


Si no desea tener cuidado acerca de la adición de todos y cada página de forma manual con el método anterior. Puedes automatizarlo. Después de código que podría dar una idea de cómo:

public class MyStyleHelper 
{ 
    public static string RenderPageSpecificStyle(string pagePath) 
    { 
     var pageName = GetPageName(pagePath); 
     string bundleName = EnsureBundle(pageName); 
     return bundleName; 
    } 

    public static string GetPageName(string pagePath) 
    { 
     string pageFileName = pagePath.Substring(pagePath.LastIndexOf('/')); 
     string pageNameWithoutExtension = Path.GetFileNameWithoutExtension(pageFileName); 
     return pageNameWithoutExtension; 
    } 

    public static string EnsureBundle(string pageName) 
    { 
     var bundleName = "~/styles/" + pageName; 
     var bundle = BundleTable.Bundles.GetBundleFor(bundleName); 
     if (bundle == null) 
     { 
      bundle = new StyleBundle(bundleName).Include(
       "~/styles/site.css", 
       "~/styles/" + pageName + ".css"); 
      BundleTable.Bundles.Add(bundle); 
     } 
     return bundleName; 
    } 
} 

Uso:

<link rel="stylesheet" type="text/css" href="<%: MyStyleHelper.RenderPageSpecificStyle(Page.AppRelativeVirtualPath) %>" /> 
+0

¿Estoy equivocado o su ejemplo de automatización supone que se trata de una aplicación MVC? –

+0

Hola James Hill, sí mi primer borrador ** fue ** MVC. Era un bloc de notas codificado y también tenía algunos errores. Ahora lo reescribí en ASP simple y probado. Parece que funciona bien. Por favor mira mis ediciones –

+0

FYI - 'ResolveUrl()' debe agregarse a su uso. No funcionará sin eso. –

Cuestiones relacionadas