Резервный вариант MVC CDN для Style Bundle

Есть ли в MVC встроенный способ указать резерв CDN для таблиц стилей? Я пытаюсь настроить запасной вариант для таблицы стилей jQuery Mobile Structure. Вот мой код в методе RegisterBundles:

var JQMstyleSheet = new StyleBundle("~/JQMstyle", "http://code.jquery.com/mobile/1.3.1/jquery.mobile.structure-1.3.1.min.css").Include("~/theme/jquery.mobile.structure-1.3.1.css");
JQMstyleSheet.CdnFallbackExpression = "window.jQuery.mobile";
bundles.Add(JQMstyleSheet);

Когда страница отображается, она выводит это в html:

<script>
(window.jQuery.mobile)||document.write('<script src="/JQMstyle"><\/script>');
</script>

Когда CDN дает сбой, он не добавляет таблицу стилей динамически, как это отлично подходит для моих файлов javascript. Я думаю, проблема в том, что он пытается отобразить скрипт, когда это должен быть стиль. Есть ли другое запасное свойство, кроме CdnFallbackExpression?

ОБНОВИТЬ

Документы Microsoft для System.Web.Optimization.StyleBundle показывают CdnFallbackExpression как доступное свойство, однако в описании говорится: «Получает расширение скрипта, отображаемое вспомогательным классом Scripts...» http://msdn.microsoft.com/en-us/library/system.web.optimization.stylebundle(v=vs.110).aspx Это ошибка в System.Web.Optimization.StyleBundle? не должно ли это свойство ссылаться на вспомогательный класс Styles?


person Adrian    schedule 08.01.2014    source источник
comment
JQMstyleSheet.CdnFallbackExpression = "window.jQuery.mobile"; зачем ты это поставил?   -  person Amila    schedule 09.01.2014
comment
Мне нужно, чтобы таблица стилей загружалась в случае сбоя cdn. проверка для window.jQuery.mobile сообщит мне, если загрузка cdn jquery mobile не удалась, тогда я знаю, что загрузка таблицы стилей cdn, скорее всего, также не удалась. Я не уверен, как проверить, существует ли таблица стилей с помощью CdnFallbackExpression.   -  person Adrian    schedule 09.01.2014


Ответы (2)


TLDR;

Ознакомьтесь с моим решением, которое предоставляет метод расширения StyleBundle для решения проблемы.

Откат набора стилей

Также

Да, в Microsoft ASP.NET Optimization Framework есть ошибка, описанная здесь.

Решение состоит в том, чтобы изменить CdnFallbackExpression, сделав его функцией javascript, которая одновременно проверяет таблицу стилей и загружает резервный вариант, игнорируя таким образом неверный сценарий из Optimization Framework.

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

У меня есть решение на GitHub, которое вы можете использовать, пока проблема не будет исправлена ​​в фреймворке; тем не менее, я бы по-прежнему остерегался сложной части определения момента фактической загрузки таблицы стилей.

person GoClimbColorado    schedule 16.02.2014

Вот мой метод RegisterBundles, и он отлично работает. Он автоматически возвращается к локальным сценариям и стилям в случае сбоя CDN. Посмотрите, может ли это помочь.

using System.Web;
using System.Web.Optimization;

    public static void RegisterBundles(BundleCollection bundles)
    {
        var jQueryCdn = "https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.4.0.min.js";
        var jQueryUICdn = "https://ajax.aspnetcdn.com/ajax/jquery.ui/1.12.1/jquery-ui.min.js";
        var jQueryUICss = "https://ajax.aspnetcdn.com/ajax/jquery.ui/1.12.1/themes/blitzer/jquery-ui.css";
        var jQueryValidateCdn = "https://ajax.aspnetcdn.com/ajax/jquery.validate/1.19.0/jquery.validate.min.js";
        var jQueryValidateUnobtrusiveCdn = "https://ajax.aspnetcdn.com/ajax/mvc/5.2.3/jquery.validate.unobtrusive.min.js";
        var modernizrCdn = "https://ajax.aspnetcdn.com/ajax/modernizr/modernizr-3.5.0.js";
        var respondCdn = "https://ajax.aspnetcdn.com/ajax/respond/1.4.2/respond.min.js";
        var bootstrapCdn = "https://ajax.aspnetcdn.com/ajax/bootstrap/4.3.1/bootstrap.min.js";
        var bootstrapCSSCdn = "https://ajax.aspnetcdn.com/ajax/bootstrap/4.3.1/css/bootstrap.min.css";

        bundles.UseCdn = true;

        bundles.Add(new ScriptBundle("~/bundles/jquery", jQueryCdn).Include(
                    "~/Scripts/jquery-{version}.js"));
        bundles.Add(new ScriptBundle("~/bundles/jqueryui", jQueryUICdn).Include(
                    "~/Scripts/jquery-ui-1.12.1.js"));
        bundles.Add(new ScriptBundle("~/bundles/jqueryval", jQueryValidateCdn).Include(
                    "~/Scripts/jquery.validate*"));
        bundles.Add(new ScriptBundle("~/bundles/jqueryUnobtrusive", jQueryValidateUnobtrusiveCdn));

        bundles.Add(new ScriptBundle("~/bundles/modernizr", modernizrCdn).Include(
                    "~/Scripts/modernizr-*"));
        bundles.Add(new ScriptBundle("~/bundles/bootstrap", bootstrapCdn).Include(
                    "~/Scripts/bootstrap.js"));
        bundles.Add(new ScriptBundle("~/bundles/respond", respondCdn).Include(
                    "~/Scripts/respond.js"));
        //Styles
        bundles.Add(new StyleBundle("~/Content/bootstrapcss", bootstrapCSSCdn).Include(
                    "~/Content/bootstrap.css"));
        bundles.Add(new StyleBundle("~/Content/jqueryuicss",jQueryUICss).Include(
                    "~/Scripts/jquery-ui.css"));
        bundles.Add(new StyleBundle("~/Content/css").Include(
                    "~/Content/site.css"));
        //set to true before deployment to use CDN files
        BundleTable.EnableOptimizations = true;
    }
person Nick Masao    schedule 17.04.2020