Asp.net mvc 如何为ASP.NET MVC区域绑定资源?

Asp.net mvc 如何为ASP.NET MVC区域绑定资源?,asp.net-mvc,asp.net-mvc-4,bundle,asp.net-optimization,Asp.net Mvc,Asp.net Mvc 4,Bundle,Asp.net Optimization,您将如何为asp.net mvc区域进行资源绑定?这是否与路由的AreaRegistration一样由ASP.NET MVC框架管理 我可以在该区域内创建一个BundleConfig类,并从App\u Start文件夹内的全局BundleConfig调用该类,但我感觉不太好 我找不到关于这个问题的任何信息。感谢您对我们想法的任何帮助。您的问题意味着您在每个区域都有单独的脚本和css文件夹?这是非常规的(尽管完全有道理)。或者,您在路由级别有一个脚本文件夹,并且您已将其拆分为每个区域的子文件夹?无

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

我可以在该区域内创建一个
BundleConfig
类,并从
App\u Start
文件夹内的全局
BundleConfig
调用该类,但我感觉不太好


我找不到关于这个问题的任何信息。感谢您对我们想法的任何帮助。

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

MVC4应用程序附带一个静态
BundleConfig
类,该类位于App\u Start文件夹中。然后从Global.asax初始化包。如果您不使用MVC4项目,请升级或启动一个现成的MVC4项目,以观察这些文件的布局

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

首先,我将使用这个全局
BundleConfig
为您的所有区域指定bundle。如果这不适合您,或者变得笨拙,您可以随时在以后将其打破

指定应包括哪些文件。您应该在捆绑包的虚拟路径前加上其所在区域的前缀。然后就可以很容易地从视图中使用区域名称进行引用-很可能是您的
\u Layout.cshtml

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

应用程序启动/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"));
    }
}
    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"));
    }
internal static class RouteConfig
{
    internal static void RegisterRoutes(AreaRegistrationContext context)
    {
        //add routes
    }
}
internal static class BundleConfig
{
    internal static void RegisterBundles(BundleCollection bundles)
    {           
        //add bundles
    }
}
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);            
    }       
}
然后,您可以使用main _Layout.cshtml上的
Scripts.Render()
来呈现正确的区域束,具体取决于用户当前查看的区域。要执行此操作,首先需要获得如下所示的当前区域:

视图/Shared/\u布局。cshtml:

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

我希望这是某种程度上更规范-但在跳入框架代码后,答案是否定的

我决定做以下几点:

解决方案结构

  • 领域:
    • 管理员
      • RouteConfig.cs
      • 捆绑图
      • AdminAreaRegistration.cs
RouteConfig.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"));
    }
}
    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"));
    }
internal static class RouteConfig
{
    internal static void RegisterRoutes(AreaRegistrationContext context)
    {
        //add routes
    }
}
internal static class BundleConfig
{
    internal static void RegisterBundles(BundleCollection bundles)
    {           
        //add bundles
    }
}
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);            
    }       
}
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"));
    }
}
    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"));
    }
internal static class RouteConfig
{
    internal static void RegisterRoutes(AreaRegistrationContext context)
    {
        //add routes
    }
}
internal static class BundleConfig
{
    internal static void RegisterBundles(BundleCollection bundles)
    {           
        //add bundles
    }
}
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);            
    }       
}
AdminAreaRegistration.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"));
    }
}
    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"));
    }
internal static class RouteConfig
{
    internal static void RegisterRoutes(AreaRegistrationContext context)
    {
        //add routes
    }
}
internal static class BundleConfig
{
    internal static void RegisterBundles(BundleCollection bundles)
    {           
        //add bundles
    }
}
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);            
    }       
}

谢谢你的回答,但这不是适合我的。我不希望global BundleConfig为这些区域进行捆绑。我还没有选择将该区域的css&js资源放在哪里。这与将捆绑包配置的责任放在哪里是一个独立的问题。我确实有一种强烈的感觉,将css和js资源放在区域内,这对我来说更自然。再次感谢!我更新了答案,试图在区域名称空间内配置一个bundle。+1供您编辑。我决定在自己的回答中寻求解决办法。这或多或少是一样的,但并不违反SRP(单一责任原则)。我更喜欢这个答案(编辑版)。两天来我一直在尝试不同的方法。最后这个解决了我的问题。在我的例子中,除了testareRegistration.cs中的BundleTable外,我还必须将(test)添加到_Layout.cshtml文件中的@Styles.Render(“~/test/Content/css”)。谢谢