20 votes

URL absolue dans un paquet ASP

J'utilise une bibliothèque jQuery pour Google Maps, et elle dépend des scripts de Google qui doivent être chargés en premier. J'aimerais pouvoir inclure les deux dans le bundle en tant que tel :

  bundles.Add(new ScriptBundle("myfoobundle").Include(
    "http://maps.googleapis.com/maps/api/js?sensor=false&libraries=places",
    "~/scripts/jquery.fooplugin-{version}.js"
  ));

Cela ne semble pas fonctionner (une exception est levée à propos de la première chaîne). Et l'on peut dire que cela ne devrait pas fonctionner parce que cette URL absolue n'est pas censée être minifiée/regroupée.

Mais l'approche actuelle est fastidieuse, car je dois m'assurer que les dépendances sont correctes, et cela se produit à différents endroits (la moitié du problème se situe dans le code de regroupement, l'autre moitié dans la vue).

Ce serait bien d'avoir une solution en une seule étape comme ci-dessus. Ai-je des options à cet égard ?

UPDATE :

Pour répondre aux commentaires concernant l'utilisation d'un CDN comme solution : si je spécifie bundles.UseCdn = true cela n'a aucun effet, et j'obtiens toujours l'exception The URL 'http://maps.googleapis.com/maps/api/js?sensor=false&libraries=places' is not valid. Only application relative URLs (~/url) are allowed . Je ne sais pas non plus quelle est l'implication de faire cela en premier lieu, parce que j'utilise déjà le support CDN pour jQuery, etc. conflit avec mon cas d'utilisation.

11voto

Noah Heldman Points 2817

Si vous utilisez une version de System.Web.Optimization >= 1.1.2, il y a une nouvelle façon pratique de surcharger les url de Styles y Scripts . Dans l'exemple ci-dessous, je saisis un fichier CdnBaseUrl de web.config à utiliser comme url de base pour tous les scripts et feuilles de style :

public class BundleConfig
{
    private static readonly string BaseUrl = ConfigurationManager.AppSettings["CdnBaseUrl"];

    public static void RegisterBundles(BundleCollection bundles)
    {
        // This is the new hotness!!
        Styles.DefaultTagFormat = "<link href=\"" + BaseUrl + "{0}\" rel=\"stylesheet\"/>";
        Scripts.DefaultTagFormat = "<script src=\"" + BaseUrl + "{0}\"></script>";

        bundles.Add(new ScriptBundle("~/bundles/js").Include(
            "Your scripts here..."
        ));

        bundles.Add(new StyleBundle("~/bundles/css").Include(
            "Your css files here..."
        ));
    }
}

Plus d'informations sur l'optimisation des sites statiques (CDN)

7voto

Hao Kung Points 13035

Actuellement, vous devriez inclure une copie locale de jquery dont vous dépendez à l'intérieur du bundle, ou vous devriez gérer les balises script comme vous le mentionnez. Nous sommes conscients de ce type de problème de gestion des dépendances et il relève de la catégorie de la gestion des actifs que nous suivons avec ceci point de travail sur codeplex

6voto

Tommy Points 17332

D'après les tutoriels MVC, votre syntaxe est incorrecte pour créer un bundle à partir d'un CDN. Et comme d'autres l'ont dit, assurez-vous que vous avez l'option bundles.UseCdn = true; est défini. En utilisant l'exemple de la page Site MVC - votre code devrait refléter ce qui suit :

public static void RegisterBundles(BundleCollection bundles)
{
   bundles.UseCdn = true;   //enable CDN support
   //add link to jquery on the CDN
   var jqueryCdnPath = "http://maps.googleapis.com/maps/api/js?sensor=false&amp;libraries=places";
   bundles.Add(new ScriptBundle("myfoobundle", jqueryCdnPath).Include(
                "~/Scripts/jquery-{version}.js"));
}

5voto

Dhrumil Bhankhar Points 758

S'il s'agit simplement d'obtenir une url absolue en paquet, vous pouvez opter pour cette solution.

public static class Extensions
    {
        public static IHtmlString RenderScript(this UrlHelper helper, params string[] paths)
        {
            string scripts = System.Web.Optimization.Scripts.Render(paths).ToHtmlString();
            string hostName = HttpContext.Current.Request.Url.Scheme + Uri.SchemeDelimiter + HttpContext.Current.Request.Url.Authority;
            string replaced = Regex.Replace(scripts, "src=\"/", "src=\"" + hostName + "/", RegexOptions.Multiline | RegexOptions.IgnoreCase);
            return new HtmlString(replaced);
        }
    }

Il s'agit de prendre le bahvior de scripts.Render et de lui appliquer des urls absolues. Ensuite, dans la vue, vous devez écrire

  @Url.RenderScript("~/bundles/jquery")

au lieu de

  @Scripts.Render("~/bundles/jquery")

Coder avec plaisir !!....

1voto

Lord of Scripts Points 601

J'ai essayé comme suggéré et cela n'a pas fonctionné :

string googleMapsApiCDN = "http://maps.google.com/maps/api/js?sensor=false&amp;language=en";
        bundles.Add(new ScriptBundle("~/bundles/gmap3", googleMapsApiCDN).Include(
                    "~/Scripts/GMap3/gmap3.min.js",         // GMap3 library
                    "~/Scripts/GMap3/mygmap3-about.js"      // Pops up and configures     
GMap3 on About page
                    ));

Le fichier mygmap3-about.js script a été rendu mais le fichier gmap3.min.js et le CDN script de google n'ont pas été rendus. tous deux exclus .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X