V komponentě Microsoft.AspNet.Web.Optimization verze 1.1.0.0 (stable) je chyba (ve verzi 1.0.0.0 tato chyba nebyla), že nedochází k odstranění duplicitních scriptů registrovaných ve ScriptManager, které jsou obsažené v bundle.
Pokud zaregistruji následující ScriptBundle:
bundles.Add(new ScriptBundle("~/bundles/app").Include(
"~/Scripts/App1.js",
"~/Scripts/App2.js"));
Kde App1.js a App2.js jsou skripty umístěny ve Webovém projetu ve složce Scripts.
A dále provedu registraci pomoci ScriptManager na stránce takto:
<asp:ScriptManager runat="server">
<Scripts>
<asp:ScriptReference Path="~/Scripts/App1.js" />
<asp:ScriptReference Path="~/bundles/app" />
</Scripts>
</asp:ScriptManager>
ScriptManager má vyhodnotit, že script App1.js se nachází již jako součást bundle ~/bundles/app a do stránky má přidat referenci pouze na bundle. Výsledek ve verzi 1.0.0.0 je správný a do zdroje stránky je přidáno:
<script src="/bundles/app?v=RSuTpai71uKpCE-gubP0zpHYM9wE6wZa2ScYspPt5P41" type="text/javascript"></script>
pokud ovšem použijeme verzi 1.1.0.0 (stable), vyhodnocení se provede špatně a do stránky jsou přidány oba skripty:
<script src="Scripts/App1.js" type="text/javascript"></script>
<script src="/bundles/app?v=RSuTpai71uKpCE-gubP0zpHYM9wE6wZa2ScYspPt5P41" type="text/javascript"></script>
Rozdíl je v chování metody GetBundleContents na objektu BundleResolver. Pokud tuto metodu zavoláme ve verzi 1.0.0.0 a 1.1.0.0 dostáváme tyto rozdílné výsledky:
System.Web.Optimization.BundleResolver.Current.GetBundleContents("~/bundles/app")
1.0.0.0:
[0] "~/Scripts/App1.js" string
[1] "~/Scripts/App2.js" string
1.1.0.0:
[0] "/Scripts/App1.js" string
[1] "/Scripts/App2.js" string
Verze 1.1.0.0 tedy špatně vrací cestu ke scriptu bez ‘~‘ a proto tato cesta nesouhlasí s cestou uvedenou ve ScriptReference Path="~/Scripts/App1.js".
Stejná chyba se vyskytne i při použití WebForm skriptů pomoci NuGet balíčku Microsoft.AspNet.ScriptManager.WebForms nebo MS Ajax skriptů pomoci NuGet balíčku Microsoft.AspNet.ScriptManager.MSAjax, které používá i například výchozí ASP.NET WebForms šablona.
Pro WebForm skripty:
<asp:ScriptManager runat="server">
<Scripts>
<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" />
</Scripts>
</asp:ScriptManager>
s bundle:
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"));
Cesty ke skriptům nejsou ve verzi 1.1.0.0 opět vyhodnoceny správně a na stránku jsou přidány všechny skripty:
<script src="Scripts/WebForms/WebUIValidation.js" type="text/javascript"></script>
<script src="Scripts/WebForms/MenuStandards.js" type="text/javascript"></script>
<script src="Scripts/WebForms/GridView.js" type="text/javascript"></script>
<script src="Scripts/WebForms/DetailsView.js" type="text/javascript"></script>
<script src="Scripts/WebForms/TreeView.js" type="text/javascript"></script>
<script src="Scripts/WebForms/WebParts.js" type="text/javascript"></script>
<script src="Scripts/WebForms/Focus.js" type="text/javascript"></script>
<script src="/bundles/WebFormsJs?v=5JltzM7KDneUw5G1P3oS9Oam475FEYG0FegmKeed7x01" type="text/javascript"></script>
Popis chyby jsem zadal jako issue na CodePlex komponenty Web Optimization.
Odkaz:
https://aspnetoptimization.codeplex.com/workitem/94