ASP捆绑包中的绝对URL

20

我在使用一个基于jQuery的Google Maps库,它依赖于首先加载Google脚本。我希望能够将它们一起打包包含在内:

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

这似乎不起作用(抛出了关于第一个字符串的异常)。有人可能会说,这不应该起作用,因为那个绝对URL不是要被压缩/捆绑的。

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

如果能有一个像上面的1步解决方案就好了。在这方面我有什么选择吗?

更新:

针对使用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。此外,我不确定这样做的影响是什么,因为我已经在使用jQuery等的CDN支持,所以不确定如何与我的用例产生冲突


第一个字符串的异常是什么意思?如果将“UseCdn”设置为true,则您的代码应该可以正常工作。 - robasta
@rob 当启用 UseCdn 时它无法工作。 - Odys
ASP捆绑包是蓝色的表格。 - Farhad Azarbarzinniaz
我注意到的行为是,bundles.UseCdn = true并且您在system.web下的编译方法必须为false (<compilation debug="false" targetFramework="4.5.2" />)。之后,CDN路径会输出到页面。 - David Yates
6个回答

11
如果您正在使用版本号大于等于1.1.2的 System.Web.Optimization,那么有一种新的方便方式可以覆盖 StylesScripts 的URL。在下面的示例中,我从web.config中获取CdnBaseUrl作为所有脚本和样式表的基础URL:
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..."
        ));
    }
}

更多有关静态站点(CDN)优化的信息


7
根据MVC教程,使用CDN创建bundle时您的语法不正确。正如其他人所说,请确保设置了bundles.UseCdn = true;属性。使用MVC网站上的示例-您的代码应该反映以下内容:
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"));
}

6
这段代码将允许我从CDN加载jQuery,这已经实现了。我想要的是在适当的捆绑包中以绝对URL的形式包含一些其他无关的库(Google Maps相关内容)。 - Bobby B

7

目前,您需要在包中包含您所依赖的jQuery的本地副本,或者像您提到的那样管理脚本标签。我们意识到这种依赖关系管理问题,它属于资产管理类别,我们正在使用CodePlex上的工作项进行跟踪。


感谢你的明确答复,Hao!我希望你们能尽快解决这个问题。我想要的只是将一个远程脚本包含到一个捆绑文件中(不像那个CodePlex工作项所解释的那么复杂)。 - Bobby B

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中获取行为,然后将绝对URL应用于它。在视图中,您需要编写以下内容:

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

替代

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

愉快地编程吧!...


谢谢Dhrumil!这对我很有帮助,当我尝试使用捆绑的jQuery文件时,我遇到了异步标签的问题。 - Rashmi Pandit

1
我按照建议尝试了这个,但它没有起作用:


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

mygmap3-about.js脚本已经呈现,但gmap3.min.js和来自Google的CDN脚本都被排除在外


0

你尝试启用CDN支持并查看是否允许绝对URL工作了吗:

bundles.UseCdn = true;

1
不确定它是否回答了问题,但知道有这样的选项是很好的。 - NVM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接