19

Używam biblioteki jQuery dla Map Google i zależy to od tego, aby najpierw załadować skrypty Google. Chciałbym być w stanie uwzględnić zarówno w wiązce jako takie:Bezwzględny adres URL w pakiecie ASP

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

nie wydają się działać (zgłasza wyjątek skarżą się na pierwszy ciąg). Można powiedzieć, że to nie powinno działać, ponieważ ten bezwzględny URL nie ma być zminimalizowany/spakowany.

Ale obecne podejście jest kłopotliwe, ponieważ potrzebuję upewnić się, że zależności są poprawne, i że dzieje się to w różnych miejscach (połowa problemu w kodzie pakietowym, druga połowa w widoku).

Byłoby miło mieć jednoetapowe rozwiązanie jak wyżej. Czy mam jakieś opcje w tym zakresie?

UPDATE:

Aby rozwiązać komentarze dotyczące użyciu CDN jako rozwiązanie: jeśli mogę określić bundles.UseCdn = true to nie ma wpływu, a ja wciąż wyjątek The URL 'http://maps.googleapis.com/maps/api/js?sensor=false&libraries=places' is not valid. Only application relative URLs (~/url) are allowed. Ponadto nie jestem pewien, co to oznacza, przede wszystkim dlatego, że już korzystam z obsługi CDN dla jQuery, itd., Więc nie jestem pewien, jak to byłoby konflikt z moim przypadkiem użycia.

+0

co robi wyjątek o pierwszym ciągiem powiedzieć? jeśli ustawisz "UseCdn' na true, twój kod powinien działać. – robasta

+0

@rob Nie działa z włączonym "UseCdn' – Odys

+0

pakiet asp jest niebieski arkusz –

Odpowiedz

7

Obecnie trzeba by obejmować lokalną kopię jQuery, które zależą od wewnątrz wiązki, albo trzeba by zarządzać znaczniki skryptów, o których wspominasz. Zdajemy sobie sprawę z tego rodzaju kwestii zarządzania depedency i mieści się w kategorii zarządzania aktywami, które jesteśmy śledzenia z tym work item on codeplex

+0

Dzięki za ostateczną odpowiedź Hao! Mam nadzieję, że wkrótce to zrobicie. Wszystko, czego szukałem, to sposób na dołączenie zdalnego skryptu do pakietu (nie jest to nic skomplikowanego, jak to wyjaśniono w tym artykule na temat kodepleksu.) –

0

Czy próbowałeś umożliwiając wsparcie CDN i widząc, że jeśli pozwala na absolutny URL do pracy:

bundles.UseCdn = true; 
+1

Nie jestem pewien, czy odpowiada na pytania, ale dobrze jest wiedzieć, że istnieje taka opcja. – NVM

+1

To nie pomaga – Odys

6

oparciu o tutoriale MVC, składnia jest niepoprawna dla tworzenia pakiet z CDN. I jak powiedzieli inni, upewnij się, że masz ustawioną właściwość bundles.UseCdn = true;. Korzystając z przykładu na MVC site - Twój kod powinien odzwierciedlać następujące:

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&libraries=places"; 
    bundles.Add(new ScriptBundle("myfoobundle", jqueryCdnPath).Include(
       "~/Scripts/jquery-{version}.js")); 
} 
+6

Ten kod pozwoli mi załadować jQuery z CDN, co już zrobiłem. Chcę, aby inne niepowiązane biblioteki (rzeczy z Google Maps) były bezwzględnym adresem URL w odpowiednim pakiecie. –

1

próbowałem to jako sugerowane i to nie działa:

string googleMapsApiCDN = "http://maps.google.com/maps/api/js?sensor=false&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 
        )); 

Skrypt mygmap3-about.js został wyrenderowany, ale plik gmap3.min.js i skrypt CDN z google, gdzie , zostały wykluczone:.

5

Jeśli chodzi tylko o uzyskanie bezwzględnego adresu URL w pakiecie, możesz przejść do tego.

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); 
     } 
    } 

To będzie w zasadzie wziąć bahvior z Scripts.Render a następnie zastosować bezwzględnych adresów URL do niego. Następnie w widoku trzeba napisać

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

zamiast

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

Ciesz kodowania !! ...

+0

Dziękuję Dhrumil! To pomogło mi podczas próby użycia tagu async z dołączonymi plikami jquery. –

8

Jeśli używasz wersji System.Web.Optimization> = 1.1.2, istnieje nowy wygodny sposób na przesłonięcie adresu URL dla Styles i Scripts. W poniższym przykładzie, jestem chwytając CdnBaseUrl z web.config użyć jako podstawowego adresu URL dla wszystkich skryptów i stylów:

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..." 
     )); 
    } 
} 

More info on static site (CDN) optimization

Powiązane problemy