Подтвердить что ты не робот

Как объединить ресурсы для областей ASP.NET MVC?

Как бы вы выполняли набор ресурсов для областей asp.net mvc? Является ли это регламентировано структурой ASP.NET MVC так же, как AreaRegistration для маршрутов?

Я мог бы сделать класс BundleConfig внутри области и вызвать это из глобального BundleConfig внутри папки App_Start, но мне это не нравится.

Я не могу найти никакой информации по этому вопросу. Любая помощь нашим мыслям ценится.

4b9b3361

Ответ 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 поставляются со статическим классом BundleConfig, который находится в папке App_Start. Затем пакет инициализируется из Global.asax. Если вы не работаете с проектом MVC4 или обновляете или просто запускаете проект из проекта MVC4, чтобы наблюдать за компоновкой этих файлов.

Связки конфигурируются просто путем объявления виртуального пути (с которого можно связать пучок), затем указывая файлы, которые вы хотите связать. Связанные файлы можно указать, указав имя файла явно, совпадение имени файла или указав каталог, в который должны быть включены все файлы.

Для начала я просто использовал бы этот глобальный BundleConfig для определения пакетов для всех ваших областей. Если это не масштабируется для вас или становится громоздким, вы всегда можете его разбить.

Укажите, какие файлы должны быть включены. Вы должны префикс виртуального пути пакета с областью, для которой она предназначена. Тогда будет легко ссылаться, используя имя 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"));
    }
}

Затем вы можете использовать Scripts.Render() на своем основном _Layout.cshtml, чтобы отобразить правильный пакет Area, в зависимости от того, в какой области он просматривает данный объект. Для этого вам сначала нужно получить текущую область так:

Представления/Общие/_Layout.cshtml:

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

ИЗМЕНИТЬ

Если вы действительно хотите управлять своим пакетом из своего региона, то регистрация в этом районе будет хорошим местом для этого. Статическое свойство BundleTable, указанное в BundleConfig, является глобальным, поэтому его можно найти где угодно. Этот код компилируется, но я его не тестировал. Это для области, называемой 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"));
    }