gpt4 book ai didi

asp.net-mvc-4 - MVC4 StyleBundle 没有以正确的顺序呈现包

转载 作者:行者123 更新时间:2023-12-03 20:23:30 25 4
gpt4 key购买 nike

我正在尝试渲染一组 css 文件,但输出顺序错误。我已经尝试过解决方案@ MVC4 Beta Minification and Bundling: Ordering files and debugging in browser ,但这没有帮助。这是捆绑包:

bundles.Add(new StyleBundle("~/stylesheet")
.Include("~/css/main.css")
.Include("~/css/mvc.css")
.Include("~/js/jquery.thickbox.css")
.Include("~/js/jquery.rating.css")
.Include("~/css/ProductListing.css")
.Include("~/css/dropdown/dropdown.css")
.Include("~/css/dropdown/dropdown.vertical.css")
.Include("~/js/fancybox/jquery.fancybox-1.3.1.css")
.Include("~/css/scartpopup.css")
.Include("~/css/ShoppingCart.css")
.Include("~/css/ceebox.css")
.Include("~/css/tooltip.css")
.Include("~/css/recent_blog_posts.css")
.Include("~/css/ProductDetail.css")
.Include("~/css/jquery-ui-1.7.3.custom.css")
.Include("~/css/filter_box.css")
.Include("~/css/custom_page.css")
.Include("~/css/Checkout.css")
.Include("~/css/CheckoutButton.css")
);

这是结果,您可以看到 jquery-ui 出现在顶部。
<link href="/css/jquery-ui-1.7.3.custom.css" rel="stylesheet"/>
<link href="/css/main.css" rel="stylesheet"/>
<link href="/css/mvc.css" rel="stylesheet"/>
<link href="/js/jquery.thickbox.css" rel="stylesheet"/>
<link href="/js/jquery.rating.css" rel="stylesheet"/>
<link href="/css/ProductListing.css" rel="stylesheet"/>
<link href="/css/dropdown/dropdown.css" rel="stylesheet"/>
<link href="/css/dropdown/dropdown.vertical.css" rel="stylesheet"/>
<link href="/js/fancybox/jquery.fancybox-1.3.1.css" rel="stylesheet"/>
<link href="/css/scartpopup.css" rel="stylesheet"/>
<link href="/css/ShoppingCart.css" rel="stylesheet"/>
<link href="/css/ceebox.css" rel="stylesheet"/>
<link href="/css/tooltip.css" rel="stylesheet"/>
<link href="/css/recent_blog_posts.css" rel="stylesheet"/>
<link href="/css/ProductDetail.css" rel="stylesheet"/>
<link href="/css/filter_box.css" rel="stylesheet"/>
<link href="/css/custom_page.css" rel="stylesheet"/>
<link href="/css/Checkout.css" rel="stylesheet"/>
<link href="/css/CheckoutButton.css" rel="stylesheet"/>

如何确保样式表以正确的顺序呈现?

最佳答案

捆绑不应该以完全相同的顺序呈现 CSS 文件,它遵循不同的逻辑。如果您需要按照定义呈现它们,那么您应该创建一个自定义 IBundleOrderer并将其设置为所需的订购者的捆绑包:

public class AsDefinedBundleOrderer : IBundleOrderer
{
public IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files)
{
return files;
}
}


var bundle = new StyleBundle("~/stylesheet");
bundle.Orderer = new AsDefinedBundleOrderer();
bundles.Add(bundle);

然后这不会对列表做任何事情,因此 Render 将完全按照相同的顺序渲染它们。

默认订购更新

捆绑使用 IBundleOrderer 的概念对 Bundle 中的项目进行排序. Bundle类(class)有 Orderer属性如下所示:
public IBundleOrderer Orderer
{
get
{
if (this._orderer == null)
return (IBundleOrderer) DefaultBundleOrderer.Instance;
else
return this._orderer;
}
set
{
this._orderer = value;
this.InvalidateCacheEntries();
}
}

所以默认的排序器实际上是一个 DefaultBundleOrderer直到你用你的自定义排序器覆盖它。
IBundleOrderer具有以下签名:
public interface IBundleOrderer
{
IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files);
}
DefaultBundleOrderer执行此命令按 BundleContext 对文件进行排序, 这是 OrderFiles 的实现片段:
  foreach (BundleFileSetOrdering ordering in (IEnumerable<BundleFileSetOrdering>) context.BundleCollection.FileSetOrderList)
DefaultBundleOrderer.AddOrderingFiles(ordering, (IEnumerable<FileInfo>) list, fileMap, foundFiles, result);

所以不同的结果发生了,因为这个。这当然不是随机排序算法:)
规则在 BUndleCollection 中定义类(class):
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);
}

所以当你从 Application_Start 调用它时:
BundleConfig.RegisterBundles(BundleTable.Bundles);

其实你通过默认 BundleCollection库中定义。

所以我们有 BundleFileSetOrdering实例一一传递给:
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);
}
}
}
}
}

结论

如果我们想简化这个过程,我们可以说库更喜欢某种文件,如果发现多种可能性,则对其他文件进行一些排序。大多数情况下这是预期的行为,但正如您所见,它很容易被 AsDefinedBundleOrderer 覆盖。所以它对给定的文件集不做任何事情,所以订单保持原始。

关于asp.net-mvc-4 - MVC4 StyleBundle 没有以正确的顺序呈现包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14775997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com