如何捆绑ASP.NET MVC区域的资源?

时间:2012-11-11 21:51:03

标签: asp.net-mvc asp.net-mvc-4 bundle asp.net-optimization

您如何为asp.net mvc区域进行资源捆绑?这是否受ASP.NET MVC框架的限制,就像路由的AreaRegistration一样?

我可以在区域内创建一个BundleConfig课程,并从BundleConfig文件夹中的全局App_Start调用此课程,但这对我感觉不错。

我找不到有关此主题的任何信息。任何帮助我们的想法都受到赞赏。

2 个答案:

答案 0 :(得分:34)

我希望这在某种程度上受到更多监管 - 但在深入研究框架代码之后,答案是否定的。

我决定做的是:

解决方案结构

  • 领域:
    • 管理
      • RouteConfig.cs
      • BundleConfig.cs
      • AdminAreaRegistration.cs

<强> RouteConfig.cs

internal static class RouteConfig
{
    internal static void RegisterRoutes(AreaRegistrationContext context)
    {
        //add routes
    }
}

<强> BundleConfig.cs

internal static class BundleConfig
{
    internal static void RegisterBundles(BundleCollection bundles)
    {           
        //add bundles
    }
}

<强> AdminAreaRegistration.cs

public class AdminAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Admin";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        RegisterRoutes(context);
        RegisterBundles();
    }

    private void RegisterRoutes(AreaRegistrationContext context)
    {
        RouteConfig.RegisterRoutes(context);
    }

    private void RegisterBundles()
    {
        BundleConfig.RegisterBundles(BundleTable.Bundles);            
    }       
}

答案 1 :(得分:22)

你的问题意味着你有单独的脚本&amp;每个区域的css文件夹?这是非常规的(虽然非常合理)。或者您可能在路由级别有一个脚本文件夹,并且您已将其拆分为每个区域的子文件夹?无论哪种方式,您都必须做一些稍微不同的事情才能获得特定于区域的捆绑包。

MVC4应用程序带有一个静态BundleConfig类,它位于App_Start文件夹中。然后从Global.asax初始化该包。如果您不使用MVC4项目升级或只是启动一个开箱即用的MVC4项目来观察这些文件的布局。

只需通过声明虚拟路径(可以从中引用捆绑包)然后指定要捆绑的文件来配置捆绑包。可以通过明确列出文件名,文件名字符匹配或指定应包含所有文件的目录来指定要捆绑的文件。

首先,我将使用此全局BundleConfig为您的所有区域指定捆绑包。如果这不适合您或变得笨拙,您可以随时将其分解。

指定应包含哪些文件。您应该在bundle的虚拟路径前面加上它所用的Area。然后,您可以使用视图中的区域名称轻松引用 - 最有可能是您的_Layout.cshtml

例如,我们在这里有两个区域,每个区域都有不同的脚本:用户

<强> App_Start / BundleConfig.cs

public class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {
        /// Bundle For User Area
        bundles.Add(new ScriptBundle("~/user/bundles/scripts").Include(
                    "~/Scripts/User/myuserscript1.js",
                    "~/Scripts/User/myuserscript2.js"));

        /// Bundle For Group Area
        bundles.Add(new ScriptBundle("~/group/bundles/scripts").Include(
                    "~/Scripts/Group/mygroupscript1.js",
                    "~/Scripts/Group/mygroupscript2.js"));
    }
}

然后,您可以使用主_Layout.cshtml上的Scripts.Render()呈现正确的区域捆绑,具体取决于用户当前正在查看的区域。要做到这一点,首先需要得到当前的区域:

观看/共享/ _Layout.cshtml:

<head>
    @{
        var currentArea = (ViewContext.RouteData.DataTokens["area"]
                              ?? String.Empty).ToString().ToLower();
    }
    @Scripts.Render("~/" + currentArea + "/bundles/scripts")
</head>

修改

如果您真的想从您的区域内管理您的捆绑包,那么区域注册将是一个很好的地方。 BundleConfig中引用的BundleTable静态属性是全局的,因此可以在任何地方引用它。这段代码编译但我还没有测试过。这是一个名为Test的区域:

<强>区/测试/ TestAreaRegistration.cs

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Test_default",
            "Test/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );

        BundleTable.Bundles.Add(new Bundle("~/test/bundles/scripts").Include(
                    "~/Areas/Test/Scripts/jquery.js"));
    }