Optimization 1.1.0.0 neodstraní duplicitní skripty registrované ve ScriptManager

Jan Holan       5. 7. 2013       ASP.NET/IIS       6480 zobrazení

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

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Oprava ve verzi 1.1.2

Můžu potvrdit, že ve verzi Microsoft.AspNet.Web.Optimization.1.1.2 je chyba opravená.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback