Visual Studio 2012を使用して新しいASP.NET Webフォームプロジェクトを作成しました。残念ながら、デフォルトのSite.Masterファイルは非常に紛らわしいです。 (これらの質問は非常に関連性が高く、同じコードをかなり参照しているため、一緒に投稿しています。)
最初に、私はすでにバンドルと縮小の目的を理解しているので、それについて議論する必要はありません。ただし、デフォルトのマスターページにスクリプトが含まれる方法を理解するnotを理解しています。
質問1:
「〜/ bundles/WebFormsJs」と呼ばれるバンドルがBundleConfig.csファイルに作成され、それでもマスターページには、これらの同じ個々の.jsファイルがそれぞれ1つずつリストされているのはなぜですかScriptManager?
BundleConfig.cs内:
bundles.Add(new ScriptBundle("~/bundles/WebFormsJs").Include(
"~/Scripts/WebForms/WebForms.js",
"~/Scripts/WebForms/WebUIValidation.js",
"~/Scripts/WebForms/MenuStandards.js",
"~/Scripts/WebForms/Focus.js",
"~/Scripts/WebForms/GridView.js",
"~/Scripts/WebForms/DetailsView.js",
"~/Scripts/WebForms/TreeView.js",
"~/Scripts/WebForms/WebParts.js"));
内部Site.Master:
<body>
<form runat="server">
<asp:ScriptManager runat="server">
<Scripts>
<%--Framework Scripts--%>
<asp:ScriptReference Name="MsAjaxBundle" />
<asp:ScriptReference Name="jquery" />
<asp:ScriptReference Name="jquery.ui.combined" />
<asp:ScriptReference Name="WebForms.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebForms.js" />
<asp:ScriptReference Name="WebUIValidation.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebUIValidation.js" />
<asp:ScriptReference Name="MenuStandards.js" Assembly="System.Web" Path="~/Scripts/WebForms/MenuStandards.js" />
<asp:ScriptReference Name="GridView.js" Assembly="System.Web" Path="~/Scripts/WebForms/GridView.js" />
<asp:ScriptReference Name="DetailsView.js" Assembly="System.Web" Path="~/Scripts/WebForms/DetailsView.js" />
<asp:ScriptReference Name="TreeView.js" Assembly="System.Web" Path="~/Scripts/WebForms/TreeView.js" />
<asp:ScriptReference Name="WebParts.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebParts.js" />
<asp:ScriptReference Name="Focus.js" Assembly="System.Web" Path="~/Scripts/WebForms/Focus.js" />
<asp:ScriptReference Name="WebFormsBundle" />
<%--Site Scripts--%>
</Scripts>
</asp:ScriptManager>
ご覧のとおり....これらの同じ.jsファイルはそれぞれScriptManagerに個別にリストされています。 BundleConfig.cs以外の場所で作成された「WebFormsJs」バンドルへの参照すらありません。これらのjavascriptファイルのそれぞれがScriptManagerでここで個別に参照される場合、なぜそのバンドルが作成されたのですか?
質問2:
なぜこのようにScriptManagerが使用されているのですか? UpdateManagerを使用するなど、Microsoft版のAjaxにはScriptManagerが必要であるという印象を受けました。ここでScriptManagerを使用する目的は何ですか...単にJavaScriptファイルを登録するだけですか?
質問3:
ScriptManagerを介してjavascriptファイルを登録する場合と、代わりに次のアプローチを使用するSite.Masterの最上部で登録する場合の違いは何ですか?
<%: Scripts.Render("~/bundles/modernizr") %>
質問4:
ScriptManagerの内部でも次のことに気付きました。
<asp:ScriptReference Name="MsAjaxBundle" />
<asp:ScriptReference Name="jquery" />
<asp:ScriptReference Name="jquery.ui.combined" />
...少なくともBundleConfig.csから「MsAjaxBundle」を認識できますが、jqueryとjquery.ui.combinedはどこで定義されていますか?私は検索を行い、packages.configでそれらへの参照を見つけました。
<package id="jQuery" version="1.7.1.1" targetFramework="net45" />
<package id="jQuery.UI.Combined" version="1.8.20.1" targetFramework="net45" />
しかし、私はここで何が起こっているのかも理解していません。 packages.configはNuGetに使用されていると思いました。さらに...これらのjQuery .jsファイルの場所のパスも表示されません。それらはここにリストされており、奇妙なことに特定のバージョンの.NET Framework(私の場合は4.5)に関連付けられています。 javascriptリソースが.NET Frameworkのバージョンに関連付けられる理由は私にはわかりません。
とにかく、質問4はこれです:ScriptManagerのリソース「jquery」はどのように追加/使用されますか? jQuery .jsファイルが他のすべてのバンドルのようにBundleConfig.csにまとめられていないのはなぜですか?
質問5:
UpdatePanelおよびこれらの種類のMicrosoft Ajaxコントロールを使用する予定がない場合、Site.Masterから次のスクリプト参照を削除できますか?これがデフォルトでここに含まれている理由については少し混乱しています。
<asp:ScriptReference Name="MsAjaxBundle" />
UPDATE:これは新しいブログ投稿であり、これについても詳しく説明します: ASP.NET記事
基本的に、webforms + bundlingは、scriptmanagerで変更することができなかった多くのレガシー動作のために、このように見えます。
特定の質問に関して:
基本的にこれは重複除外が正しく機能するため、スクリプトマネージャーには元のスクリプトリソースに制限があり、スクリプトマッピングができないため、ディスクにマップする必要があります。ファイルは既にバンドルに含まれているため、適切に重複除外されます。 WebformsBundleJsは、ScriptManager nupkgs内のPreAppStartコード内に作成されるスクリプトマッピングです。 (これを発見することはほぼ不可能であることに同意します)
控えめな検証などの新しい4.5機能にはjquery(scriptmanager経由)が必要だったため、jqueryが2回レンダリングされないようにするためにスクリプトマネージャーが使用されました。
これは正常に機能しますが、ScriptManagerで重複排除されることはありません。したがって、modernizrにとっては問題になりません。
Jqueryパッケージは、jqueryファイルをScriptsフォルダーのディスクにドロップします。
その参照は、すべてのajaxスクリプトを含むmsajaxbundleを取り込みます。必要ない場合は、削除しても安全だと思います。
質問1の回答の受け入れの説明から何かを明確にするために:
個々のWebフォームjsファイルのスクリプト参照の理由は、ローカルファイル( "〜/ Scripts/WebForms/WebForms.js"など)がSystem.Web.dllに存在する同じファイルをオーバーライドできるようにするためです(If System.Web.dllを反映し、参照フォルダーを見ると、同じ.jsファイルが見つかります)。
ほぼ同じ質問もありました...
ただし、質問4については、別の意見があります。
webFormsBundleとMsAjaxBundleは、どちらもPreAppStatCodeで定義されたスクリプト参照です(このファイルがどこにあるかわかりません)。
そのため、同じ場所(ScriptManager.WebForms PreAppStartCode)には、デフォルトでjqueryおよびjQueryUIスクリプト参照の別の定義があると感じています。これらの参照は、スクリプトマネージャーで使用されます。
この方法はCDNなどの重要な機能を活用するため、このプロセスは非常に重要です。マスターページのスクリプトマネージャーでEnableCDN(EnableCdn = "true")