2012-07-20 19 views
14

私はちょうどVS 2012 RCで作業を始めました。マスターページと単一のWebフォームを使ってテストサイトを作成しました。現在、私は、サイト上で全体Stylesフォルダをバンドルするためにこのコードを使用しています:Visual Studio 2012条件付きバンドル

Global.asaxの

BundleTable.Bundles.EnableDefaultBundles(); 

Site.master

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

質問:テストサイトには、サイト全体の外観を制御するサイトレベルのCSSファイルがあります。サイトレベルのCSSに加えて、各ページに独自のCSS定義を持つことができます。マスターページにsite.cssファイルのみを含めることは可能ですか?各ページに必要なときに条件付きで.cssファイルをバンドルに追加できますか?

私はDefault.aspxの背後にあるコードでこれを試してみましたが、それはうまくいきませんでした:

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

をバンドルしていますか? –

+0

@TimBJames、私は*フォルダ全体の内容を読み込んでいました。マスターページにサイトレベルのCSSだけをロードし、必要に応じて追加のCSSファイルをバンドルしたいと思います。 –

+0

これをはじめて読む。これはバンドルの目的を破るものではありませんか?結局のところ、バンドルせずに、最初のロードでsite.cssとpage1.cssをロードすると、2ページ目に行くとページ3のpage2.css、page3.cssなどしかロードされません。ページ固有のCSSファイル通常は一般的なサイトよりもはるかに小さく、バンドルすると各ページに異なる大きなファイルを読み込み、バンドルすることなく各ページに小さなファイルを読み込みますが、改善だけが最初のページになります2の代わりに1つのファイルをロードする(同じ合計サイズ) – Rodolfo

答えて

7

私の提案:

後藤Global.asaxを。次のように

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

ができれフォルダApp_Startで、クラスBundleConfigを検索または作成します:

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

    } 
} 

は今、すべての該当するページに対応するバンドルを使用します。

<link rel="stylesheet" type="text/css" href="Styles/page1" /> 
Application_Startは、次の行が含まれている方法を確認してください

コードより:

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

(これはcshtmlですが、aspxの構文は確かに非常に似ています)。

ページごとに別々のバンドルが必要です。 1つのバンドルと同じバンドルをオンザフライで変更しないでください。バンドルには仮想URLがあります。あなたの例では、ちょうどcssです。これらはブラウザによってキャッシュされるため、天気に関係なく、バンドルの内容を変更しても、ブラウザはこれが同じだと思うかもしれませんし、再フェッチしません。


あなたは上記の方法に手動で一人ひとりのページを追加する方法について世話をしたくない場合。あなたはそれを自動化することができます。次のコードは、あなたのアイデアを与えることができる方法:

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

使用法:あなたが唯一のマスターでsite.cssし、ページのCSSファイルをロードしている場合は、なぜあなたは

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

私は間違っていますか、またはあなたのオートメーションの例でこれがMVCアプリケーションであると仮定していますか? –

+0

こんにちはJames Hill、はい私の最初の簡単なドラフトは** MVCでした。それはメモ帳でコード化され、いくつかのバグもありました。今私はそれをプレーンなASPに書き直してテストしました。うまくいくようです。私の編集内容を見てください。 –

+0

FYI - あなたの用途に 'ResolveUrl()'を追加する必要があります。それなしでは仕事はできません。 –

関連する問題