Il bundling non deve eseguire il rendering dei file CSS nello stesso ordine, ma segue una logica diversa. Se avete bisogno di rendere loro come definito, allora si dovrebbe creare un custom IBundleOrderer e impostarlo al fascio come il committente richieste:
public class AsDefinedBundleOrderer : IBundleOrderer
{
public IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files)
{
return files;
}
}
E
var bundle = new StyleBundle("~/stylesheet");
bundle.Orderer = new AsDefinedBundleOrderer();
bundles.Add(bundle);
Allora questo non farà nulla con la lista quindi Render li renderà esattamente nello stesso ordine.
Aggiornamento sulla Ordinamento predefinito
impacchettatriciLe utilizza il concetto di IBundleOrderer
per ordinare gli elementi all'interno di un Bundle
. La classe Bundle
ha il Orderer
proprietà che assomiglia a questo:
public IBundleOrderer Orderer
{
get
{
if (this._orderer == null)
return (IBundleOrderer) DefaultBundleOrderer.Instance;
else
return this._orderer;
}
set
{
this._orderer = value;
this.InvalidateCacheEntries();
}
}
Così il committente di default è in realtà un DefaultBundleOrderer
fino a quando si sovrascrive con il committente personalizzato.
Il IBundleOrderer
ha la seguente firma:
public interface IBundleOrderer
{
IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files);
}
La DefaultBundleOrderer
attuazione della presente ordina i file in base alla BundleContext
, ecco un frammento di dall'attuazione di OrderFiles
:
foreach (BundleFileSetOrdering ordering in (IEnumerable<BundleFileSetOrdering>) context.BundleCollection.FileSetOrderList)
DefaultBundleOrderer.AddOrderingFiles(ordering, (IEnumerable<FileInfo>) list, fileMap, foundFiles, result);
Così il diverso il risultato succede perché questo. Questo è, naturalmente, non è un algoritmo di ordinamento casuale :) Le regole sono definite nella classe BUndleCollection
:
public static void AddDefaultFileOrderings(IList<BundleFileSetOrdering> list)
{
if (list == null)
throw new ArgumentNullException("list");
BundleFileSetOrdering bundleFileSetOrdering1 = new BundleFileSetOrdering("css");
bundleFileSetOrdering1.Files.Add("reset.css");
bundleFileSetOrdering1.Files.Add("normalize.css");
list.Add(bundleFileSetOrdering1);
BundleFileSetOrdering bundleFileSetOrdering2 = new BundleFileSetOrdering("jquery");
bundleFileSetOrdering2.Files.Add("jquery.js");
bundleFileSetOrdering2.Files.Add("jquery-min.js");
bundleFileSetOrdering2.Files.Add("jquery-*");
bundleFileSetOrdering2.Files.Add("jquery-ui*");
bundleFileSetOrdering2.Files.Add("jquery.ui*");
bundleFileSetOrdering2.Files.Add("jquery.unobtrusive*");
bundleFileSetOrdering2.Files.Add("jquery.validate*");
list.Add(bundleFileSetOrdering2);
BundleFileSetOrdering bundleFileSetOrdering3 = new BundleFileSetOrdering("modernizr");
bundleFileSetOrdering3.Files.Add("modernizr-*");
list.Add(bundleFileSetOrdering3);
BundleFileSetOrdering bundleFileSetOrdering4 = new BundleFileSetOrdering("dojo");
bundleFileSetOrdering4.Files.Add("dojo.*");
list.Add(bundleFileSetOrdering4);
BundleFileSetOrdering bundleFileSetOrdering5 = new BundleFileSetOrdering("moo");
bundleFileSetOrdering5.Files.Add("mootools-core*");
bundleFileSetOrdering5.Files.Add("mootools-*");
list.Add(bundleFileSetOrdering5);
BundleFileSetOrdering bundleFileSetOrdering6 = new BundleFileSetOrdering("prototype");
bundleFileSetOrdering6.Files.Add("prototype.js");
bundleFileSetOrdering6.Files.Add("prototype-*");
bundleFileSetOrdering6.Files.Add("scriptaculous-*");
list.Add(bundleFileSetOrdering6);
BundleFileSetOrdering bundleFileSetOrdering7 = new BundleFileSetOrdering("ext");
bundleFileSetOrdering7.Files.Add("ext.js");
bundleFileSetOrdering7.Files.Add("ext-*");
list.Add(bundleFileSetOrdering7);
}
Così, quando si chiama questo da Application_Start
:
BundleConfig.RegisterBundles(BundleTable.Bundles);
In realtà si passa il default BundleCollection
definito nella biblioteca.
Così abbiamo la BundleFileSetOrdering
casi passati uno per uno in:
private static void AddOrderingFiles(BundleFileSetOrdering ordering, IEnumerable<FileInfo> files, Dictionary<string, HashSet<FileInfo>> fileMap, HashSet<FileInfo> foundFiles, List<FileInfo> result)
{
foreach (string key in (IEnumerable<string>) ordering.Files)
{
if (key.EndsWith("*", StringComparison.OrdinalIgnoreCase))
{
string str = key.Substring(0, key.Length - 1);
foreach (FileInfo fileInfo in files)
{
if (!foundFiles.Contains(fileInfo) && fileInfo.Name.StartsWith(str, StringComparison.OrdinalIgnoreCase))
{
result.Add(fileInfo);
foundFiles.Add(fileInfo);
}
}
}
else if (fileMap.ContainsKey(key))
{
List<FileInfo> list = new List<FileInfo>((IEnumerable<FileInfo>) fileMap[key]);
list.Sort((IComparer<FileInfo>) FileInfoComparer.Instance);
foreach (FileInfo fileInfo in list)
{
if (!foundFiles.Contains(fileInfo))
{
result.Add(fileInfo);
foundFiles.Add(fileInfo);
}
}
}
}
}
Conclusione
Se vogliamo semplificare il processo si può dire che la biblioteca preferisce un qualche tipo di file e rende l'ordinamento sugli altri file se sono state trovate più possibilità. Questo è il comportamento atteso per la maggior parte del tempo ma, come puoi vedere, è facilmente sostituibile con lo AsDefinedBundleOrderer
, quindi non fa nulla con il set di file specificato in modo che l'ordine resti originale.
Ho avuto questo problema quando avevo il riferimento CSS specifico in più di un pacchetto o quando lo includevo direttamente in _Layout.cshtml. – da7rutrak
Non è referenziato in più di un pacchetto. Devo metterlo in _layout.cshtml, è usato in tutte le pagine. Stranamente, se rinominare il file in qualcos'altro, come jqui.css, il problema scompare. –
Intendo che hai fatto riferimento al file CSS direttamente nel _Layout.cshtml, non che hai incluso il bundle nel file come deve succedere. – da7rutrak