web-dev-qa-db-ja.com

ASPバンドル内の絶対URL

私はGoogleマップにjQueryライブラリーを使用していますが、それは最初にロードされる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サポートを既に使用しているため、そもそもそれがどのような意味を持つのかは不明です。そのため、ユースケースでconflictがどのように使用されるかは不明です。

20
Bobby B

現在、バンドルの内部に依存しているjqueryのローカルコピーを含める必要があります。または、言及したようにスクリプトタグを管理する必要があります。私たちはこの種の依存性管理の問題を認識しており、これはこれで追跡している資産管理のカテゴリーに該当します codeplexの作業項目

7
Hao Kung

System.Web.Optimization> = 1.1.2のバージョンを使用している場合、StylesおよびScriptsの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)最適化の詳細

9
Noah Heldman

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

バンドル内の絶対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")

コーディングをお楽しみください!! ...

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とgoogleのCDNスクリプト--両方が除外されていますです。

1
Lord of Scripts

CDNサポートを有効にして、絶対URLが機能するかどうかを確認しましたか?

bundles.UseCdn = true;
0