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

Закрепить ASP.Net MVC Bundle для рендеринга файлов javascript в определенном порядке

Я работаю над приложением ASP.Net MVC 4 и использую Bundling и minifiction для рендеринга стилей и script файлов.

У меня есть файл script (Файл A), который вызывает функцию в другом файле ( Файл B), когда я использую @Scripts.Render() он передает тэг link для Файл A до Файл B, чтобы он запускал ошибку, а script работал неправильно.

Есть ли способ заставить @Script.Render() отображать теги link в определенном порядке без использования отдельного пакета для каждого файла????

ИЗМЕНИТЬ

Я использую метод IncludeDirectory для включения всех script файлов в эту папку

public class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {
        bundles.Add(new ScriptBundle("~/bundles/js").IncludeDirectory(
                    "~/Scripts/js",
                    "*.js"));
    }
}
4b9b3361

Ответ 2

Связывание по умолчанию добавит сценарии в алфавитном порядке. Он будет перемещаться по известным библиотекам и добавлять их в правильном порядке (сначала будет помещен jQuery, а затем, например, jQuery-ui).

Самый простой способ - заказать скрипты самостоятельно. Одним из способов является перемещение ваших пользовательских сценариев в другую папку, а затем добавление всех сценариев в их собственный пакет в нужном вам порядке:

public class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {
        bundles.Add(new ScriptBundle("~/bundles/js").IncludeDirectory(
                    "~/Scripts/js","*.js"));

        bundles.Add(new ScriptBundle("~/bundles/myScripts").Include(
            "~/Scripts/custom/scriptB.js",
            "~/Scripts/custom/scriptA.js"));
    }
}

Еще один вариант - подстановочные знаки. Этот параметр по-прежнему включает перемещение пользовательских сценариев в их собственную папку, но только с одним пакетом (источником): *

public class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {       
        bundles.Add(new ScriptBundle("~/bundles/js").Include(
            "~/Scripts/*.js",
            "~/Scripts/custom/scriptB.js",
            "~/Scripts/custom/scriptA.js"));
    }
}

Также касательно вашего комментария "Есть ли способ заставить @Script.Render() отображать теги link в определенном порядке, не используя отдельный пакет для каждого файла" - обратите внимание, что отдельные теги ссылок происходят только в режиме отладки. После развертывания в режиме выпуска будет только один тег ссылки и один файл.

Ответ 3

Посмотрите на BundleCollection.FileSetOrderList для заказа связанных файлов. Я нашел это сообщение в блоге об этом: http://weblogs.asp.net/imranbaloch/archive/2012/09/30/hidden-options-of-asp-net-bundling-and-minification.aspx, что объясняет это довольно хорошо.

Пример кода для упорядочения JQuery:

BundleFileSetOrdering bundleFileSetOrdering1 = new BundleFileSetOrdering("jquery");
bundleFileSetOrdering1.Files.Add("jquery.js");
bundleFileSetOrdering1.Files.Add("jquery-min.js");
bundleFileSetOrdering1.Files.Add("jquery-*");
bundleFileSetOrdering1.Files.Add("jquery-ui*");
bundleFileSetOrdering1.Files.Add("jquery.ui*");
bundleFileSetOrdering1.Files.Add("jquery.unobtrusive*");
bundleFileSetOrdering1.Files.Add("jquery.validate*");
bundles.FileSetOrderList.Add(bundleFileSetOrdering1);

Ответ 4

Вам следует рассмотреть возможность использования Cassette http://getcassette.net/ Он поддерживает автоматическое обнаружение зависимостей script на основе script ссылок, найденных внутри каждого файла.

Если вы предпочитаете придерживаться решения MS Web Optimization, но, как идея создания сценариев на основе ссылок script, вы должны прочитать мой блог в блоге http://blogs.microsoft.co.il/oric/2013/12/27/building-single-page-application-bundle-orderer/