在ASP束绝对URL(Absolute URL in ASP bundle)

2019-07-04 10:14发布

我使用jQuery库的谷歌地图,而这取决于谷歌的脚本首先被加载。 我希望能够在束这样以包括:

  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 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支持等,所以不知道该如何将我的使用情况下发生冲突

Answer 1:

目前,你必须包括你是取决于束内的jQuery的本地副本,或者你会为你提到管理脚本标记。 我们都知道这种depedency管理问题的,它属于资产管理,我们与此跟踪类别下CodePlex上工作项目



Answer 2:

如果您正在使用一个版本的System.Web.Optimization > = 1.1.2,有重写的URL为一个新的便捷的方式StylesScripts 。 在下面的例子中,我抓住一个CdnBaseUrlweb.config的基本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)优化更多信息



Answer 3:

基于MVC的教程,你的语法不正确创建从CDN捆绑。 正如其他人说,请确保您有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"));
}


Answer 4:

如果它仅仅是一个越来越捆绑绝对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给它。 然后在视图中,您必须编写

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

代替

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

享受编码!! ...



Answer 5:

我想这是建议,并没有工作:

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的脚本, 都排除在外



Answer 6:

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

bundles.UseCdn = true;


文章来源: Absolute URL in ASP bundle