您的问题意味着每个区域都有单独的脚本和 css 文件夹?这是非常规的(尽管完全合理)。或者您在路由级别有一个脚本文件夹,并且您已将其拆分为每个区域的子文件夹?无论哪种方式,您都必须做一些稍微不同的事情才能获得特定于区域的捆绑包。
MVC4 应用程序带有一个位于 App_Start 文件夹中的静态 BundleConfig 类。然后从 Global.asax 初始化包。如果您不使用 MVC4 项目,请升级或启动一个开箱即用的 MVC4 项目以观察这些文件的布局。
通过声明一个虚拟路径(可以从中引用该包)然后指定您希望捆绑的文件来简单地配置捆绑包。要捆绑的文件可以通过显式列出文件名、文件名字符匹配或指定应包含所有文件的目录来指定。
首先,我将使用这个全局 BundleConfig 为您的所有区域指定捆绑包。如果这不适合您或变得笨拙,您可以随时将其拆分出来。
指定应包含哪些文件。您应该在捆绑包的虚拟路径前面加上它所针对的区域。然后使用您的视图中的区域名称将很容易引用 - 很可能是您的_Layout.cshtml。
例如,这里有两个区域,每个区域都有不同的脚本:User 和 Group。
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"));
}