【问题标题】:How to bundle resources for ASP.NET MVC areas?如何为 ASP.NET MVC 区域捆绑资源?
【发布时间】:2012-10-31 09:53:07
【问题描述】:

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

我可以在该区域内创建一个 BundleConfig 类,然后从 App_Start 文件夹内的全局 BundleConfig 调用它,但这对我来说感觉不好。

我找不到有关此主题的任何信息。感谢您对我们的想法的任何帮助。

【问题讨论】:

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


    【解决方案1】:

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

    我决定做的是:

    解决方案结构

    • 领域:
      • 管理员
        • 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);            
        }       
    }
    

    【讨论】:

      【解决方案2】:

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

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

      通过声明一个虚拟路径(可以从中引用该包)然后指定您希望捆绑的文件来简单地配置捆绑包。要捆绑的文件可以通过显式列出文件名、文件名字符匹配或指定应包含所有文件的目录来指定。

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

      指定应包含哪些文件。您应该在捆绑包的虚拟路径前面加上它所针对的区域。然后使用您的视图中的区域名称将很容易引用 - 很可能是您的_Layout.cshtml

      例如,这里有两个区域,每个区域都有不同的脚本:UserGroup

      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 静态属性是全局的,因此可以在任何地方引用。这段代码可以编译,但我还没有测试过。这是一个名为测试的区域:

      Areas/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"));
          }
      

      【讨论】:

      • 感谢您的回答,但这不适合我。我不希望全局 BundleConfig 对这些区域进行捆绑。我还没有决定在哪里放置该区域的 css 和 js 资源。这与将捆绑配置的责任放在哪里是分开的。将 css 和 js 资源放在该区域本身内,我确实有一种更强烈的感觉,这对我来说感觉更自然。再次感谢!
      • 我已经更新了答案,尝试在 Area 命名空间中配置一个包。
      • +1 供您编辑。我决定在自己的答案中寻求解决方案。这或多或少相同,但不违反 SRP(单一责任原则)。
      • 我更喜欢这个答案(编辑版)。这两天我一直在尝试不同的方法。最后这个解决了我的问题。就我而言,除了 TestAreaRegistration.cs 中的 BundleTable 之外,我还必须将(测试)添加到 _Layout.cshtml 文件中的 @Styles.Render("~/test/Content/css") 中。谢谢
      猜你喜欢
      • 2013-08-27
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 2011-08-07
      • 2016-03-15
      • 2019-02-08
      • 1970-01-01
      相关资源
      最近更新 更多