14

我刚开始使用 VS 2012 RC。我创建了一个带有母版页和单个 Web 表单的测试站点。目前,我正在使用此代码捆绑Styles网站上的整个文件夹:

全球.asax

BundleTable.Bundles.EnableDefaultBundles();

站点主

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

1 回答 1

7

我的建议:

转到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. 这些由浏览器缓存,因此无论天气如何,您都在运行中更改了 bundle 的内容,浏览器可能会认为这是相同的并且不会重新获取它。


如果您不想将每个页面手动添加到上述方法中。你可以自动化它。以下代码可以让您了解如何:

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) %>" />
于 2012-07-25T20:50:34.123 回答