ASP包中的绝对URL

时间:2012-12-03 11:51:15

标签: asp.net-mvc asp.net-mvc-4 asp.net-optimization bundling-and-minification

我为谷歌地图使用jQuery库,它取决于首先加载的谷歌脚本。我希望能够在这个包中包含这两个:

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

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

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

如上所述,拥有一步解决方案会很高兴。我在这方面有什么选择吗?

更新:

解决有关使用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支持,因此不确定如何与我的用例冲突

6 个答案:

答案 0 :(得分:9)

如果您使用的是System.Web.Optimization> = 1.1.2版本,则有一种新的方便方法可以覆盖StylesScripts的网址。在下面的示例中,我从CdnBaseUrl抓取web.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

答案 1 :(得分:7)

目前,您必须在捆绑包中包含您依赖的jquery的本地副本,或者您必须在提及时管理脚本标记。我们知道这种依赖管理问题,它属于资产管理类别,我们正在跟踪work item on codeplex

答案 2 :(得分: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&amp;libraries=places";
   bundles.Add(new ScriptBundle("myfoobundle", jqueryCdnPath).Include(
                "~/Scripts/jquery-{version}.js"));
}

答案 3 :(得分:5)

如果只是在捆绑中获取绝对网址,那么你可以选择这个。

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。然后在视图中你必须写

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

而不是

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

享受编码!! ...

答案 4 :(得分: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和谷歌的CDN脚本都被排除

答案 5 :(得分:0)

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

bundles.UseCdn = true;