19

我对Google地图使用jQuery库,它取决于首先加载的Google脚本。我希望能够在束这样以包括:ASP包中的绝对URL

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

这似乎并不工作(抛出一个异常抱怨的第一个字符串)。有人可能会说这不应该起作用,因为绝对URL不会被缩小/捆绑。

但是目前的方法很麻烦,因为我需要确保依赖性是正确的,并且发生在不同的地方(捆绑代码中的一半,视图中的另一半)。

如果您有上述的1步解决方案,我们感到非常高兴。在这方面我有什么选择吗?

UPDATE:

为了解决使用CDN作为一种解决方案有关的意见:如果我指定bundles.UseCdn = true它有没有效果,我仍然得到异常The URL 'http://maps.googleapis.com/maps/api/js?sensor=false&libraries=places' is not valid. Only application relative URLs (~/url) are allowed。另外,我不确定这样做的意义是什么,因为我已经使用CDN支持jQuery等,所以不确定与我的用例冲突

+0

什么关于第一个字符串异常说呢?如果你将UseCdn设置为true,你的代码应该可以工作。 – robasta

+0

@rob它不适用于启用UseCdn – Odys

+0

asp包是蓝色表 –

回答

7

目前,你必须包括你是取决于束内的jQuery的本地副本,或者你将不得不管理脚本标签,你提到。我们都知道这种depedency管理问题的,它属于资产管理,我们与此work item on codeplex

+0

谢谢你的确切答案郝!我希望你们能很快回到这个位置。我一直在寻找的是一种将远程脚本包含在一个包中的方法(没有任何复杂的东西,就像在codeplex workitem中所解释的那样) –

0

您是否尝试过让CDN支持,看是否允许绝对URL工作:

bundles.UseCdn = true; 
+1

不知道它是否回答这些问题,但很高兴知道有这样的选项。 – NVM

+1

它没有帮助 – Odys

6

基于MVC的教程,你的语法不正确创建从CDN捆绑。正如其他人所说,确保您拥有bundles.UseCdn = true;属性集。使用上MVC site的例子 - 你的代码应体现以下几点:

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

这段代码将允许我从CDN加载jQuery,我已经这样做了。我想要的是在适当的包中包含一些其他不相关的库(Google Maps的东西)作为绝对URL。 –

1

我尝试这样做跟踪,建议的类别下,并没有奏效:

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

的mygmap3-about.js脚本被呈现,但gmap3.min.js和谷歌的CDN脚本都排除了

5

如果这只是一个获取捆绑绝对URL的问题,那么你可以去这个。

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

这将基本上从Scripts.Render采取bahvior,然后将绝对的URL应用到它。然后在视图中,您有如果您使用的System.Web.Optimization> = 1.1版本写的,而不是

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

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

享受编码!! ...

+0

感谢Dhrumil!当我试图在绑定的jquery文件中使用异步标记时,这帮助了我。 –

8

。2,有一种覆盖StylesScripts的url的新方便方法。在下面的例子中,我抓住一个CdnBaseUrlweb.config基础网址用于所有脚本和样式:

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