Mar*_*n B 21 asp.net-mvc bundle asp.net-mvc-4 asp.net-optimization
你会如何为asp.net mvc区域进行资源捆绑?这是否受ASP.NET MVC框架的限制,就像AreaRegistrationfor routes一样?
我可以做一个BundleConfig类区域内,并从全球称之为BundleConfig内部App_Start文件夹,但这种感觉好好尝试一下对我好.
我找不到有关此主题的任何信息.任何帮助我们的意见表示赞赏.
Mar*_*n B 35
我希望这在某种程度上受到更多监管 - 但在深入研究框架代码之后,对此的回答是否定的.
我决定做的是以下内容:
解决方案结构
RouteConfig.cs
internal static class RouteConfig
{
internal static void RegisterRoutes(AreaRegistrationContext context)
{
//add routes
}
}
Run Code Online (Sandbox Code Playgroud)
BundleConfig.cs
internal static class BundleConfig
{
internal static void RegisterBundles(BundleCollection bundles)
{
//add bundles
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
Nic*_*ick 23
您的问题意味着每个区域都有单独的脚本和css文件夹?这是非常规的(虽然非常合理).或者您可能在路由级别有一个脚本文件夹,并且您已将其拆分为每个区域的子文件夹?无论哪种方式,您都必须执行稍微不同的操作才能获得特定于区域的捆绑包.
MVC4应用程序带有一个BundleConfig位于App_Start文件夹中的静态类.然后从Global.asax初始化该包.如果您不使用MVC4项目升级或只是启动一个开箱即用的MVC4项目来观察这些文件的布局.
只需通过声明虚拟路径(可以从中引用捆绑包)然后指定要捆绑的文件来配置捆绑包.可以通过明确列出文件名,文件名字符匹配或指定应包含所有文件的目录来指定要捆绑的文件.
首先,我将使用此全局BundleConfig来指定所有区域的包.如果这不适合您或变得笨拙,您可以随时将其分解.
指定应包含哪些文件.您应该在bundle的虚拟路径前面加上它所用的Area.然后,您可以使用视图中的区域名称轻松引用 - 很可能是您的_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"));
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用Scripts.Render()主_Layout.cshtml上的正确区域包,这取决于用户当前正在查看的区域.要做到这一点,首先需要得到当前的区域:
查看/共享/ _Layout.cshtml:
<head>
@{
var currentArea = (ViewContext.RouteData.DataTokens["area"]
?? String.Empty).ToString().ToLower();
}
@Scripts.Render("~/" + currentArea + "/bundles/scripts")
</head>
Run Code Online (Sandbox Code Playgroud)
如果您真的想从您的区域内管理您的捆绑,那么区域注册将是一个很好的地方.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"));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21108 次 |
| 最近记录: |