Условное объединение Visual Studio 2012

Я только начал работать с VS 2012 RC. Я создал тестовый сайт с главной страницей и одной веб-формой. В настоящее время я использую этот код для объединения всей папки Styles на сайт:

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

Ответы

Ответ 1

Мое предложение:

Перейти к Global.asax. Убедитесь, что метод Application_Start содержит следующую строку:

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

Найти или создать класс BundleConfig следующим образом, желательно в папке 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"));

    }
}

Теперь используйте соответствующий пакет на каждой подходящей странице:

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

Или лучше от кода:

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

(это cshtml, но синтаксис aspx наверняка очень похож).

Обратите внимание, что у вас должен быть отдельный пакет на страницу. Вы не должны изменять один и тот же комплект на лету. Связки имеют виртуальные адреса. В вашем примере это просто 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;
    }
}

Использование:

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