Web.Optimizations - 从样式/脚本包中获取所有包含的任何方式?

tim*_*ord 10 c# asp.net asp.net-mvc bundling-and-minification asp.net-optimization

我正在使用一些动态捆绑,它根据配置添加CSS和JS文件.

我启动了一个新的StyleBundle,这样:

var cssBundle = new StyleBundle("~/bundle/css");
Run Code Online (Sandbox Code Playgroud)

然后循环通过配置并添加任何找到的包括:

cssBundle.Include(config.Source);
Run Code Online (Sandbox Code Playgroud)

循环之后,我想检查是否包含任何文件/目录.我知道有EnumerateFiles(),但我不认为这100%是为了这个目的.

其他人以前做过类似的事吗?

Cor*_*rey 15

Bundle类使用不暴露给应用程序内部的项目列表,而不一定通过反射(我试过,无法得到任何内容)访问.您可以使用BundleResolver类来获取有关此内容的一些信息:

var cssBundle = new StyleBundle("~/bundle/css");
cssBundle.Include(config.Source);

// if your bundle is already in BundleTable.Bundles list, use that.  Otherwise...
var collection = new BundleCollection();
collection.Add(cssBundle)

// get bundle contents
var resolver = new BundleResolver(collection);
List<string> cont = resolver.GetBundleContents("~/bundle/css").ToList();
Run Code Online (Sandbox Code Playgroud)

如果你只需要一个计数,那么:

int count = resolver.GetBundleContents("~/bundle/css").Count();
Run Code Online (Sandbox Code Playgroud)

编辑:使用反射

显然我之前的反射测试做错了.

这实际上有效:

using System.Reflection;
using System.Web.Optimization;

...

int count = ((ItemRegistry)typeof(Bundle).GetProperty("Items", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(cssBundle, null)).Count;
Run Code Online (Sandbox Code Playgroud)

你当然应该在那里添加一些安全检查,就像许多反映例子一样,这违反了Items财产的预期安全性,但确实有效.