use*_*457 18 asp.net-mvc bundle
如果缺少javascript或css文件,是否可能以某种方式抛出异常?
我已尝试使用下面的代码,但它从未抛出异常......
public class BundleConfig {
public static void RegisterBundles(BundleCollection bundles) {
....
bundles.Add(new ScriptBundle("~/bundles/something").Include("~/Scripts/nonExistingFile.js"));
// I would like the above usage of Include method with
// a non-existing file to throw an exception to make it
// obvious that an expected file is missing ...
// but since it does not I tried to implement a method as below ...
...
AssertThatAllFilesExist(bundles);
// but unfortunately an exception is never thrown but when
// iterating the files in the method below,
// the non-existing file seems to never become retrieved ...
}
private static void AssertThatAllFilesExist(BundleCollection bundles) {
HttpContext currentHttpContext = HttpContext.Current;
var httpContext = new HttpContextWrapper(currentHttpContext);
foreach (var bundle in bundles) {
var bundleContext = new BundleContext(httpContext, bundles, bundle.Path);
IEnumerable<FileInfo> files = bundle.EnumerateFiles(bundleContext);
foreach (var file in files) {
if (!file.Exists) {
// if this problem would occur then it should
// indicate that one of the arguments of the
// method "Bundle.Include" does not
// correspond to an existing file ...
throw new ArgumentException("The following file does not exist: " + file.FullName);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我使用这个类而不是ScriptBundle:
public class ScriptBundleWithException : ScriptBundle
{
public ScriptBundleWithException( string virtualPath ) : base( virtualPath ) {}
public ScriptBundleWithException( string virtualPath, string cdnPath ) : base( virtualPath, cdnPath ) {}
public override Bundle Include( params string[] virtualPaths )
{
foreach ( var virtualPath in virtualPaths ) {
Include( virtualPath );
}
return this;
}
public override Bundle Include( string virtualPath, params IItemTransform[] transforms )
{
var realPath = System.Web.Hosting.HostingEnvironment.MapPath( virtualPath );
if ( !File.Exists( realPath ) ) {
throw new FileNotFoundException( "Virtual path not found: " + virtualPath );
}
return base.Include( virtualPath, transforms );
}
}
Run Code Online (Sandbox Code Playgroud)
然后在配置中:
bundles.Add( new ScriptBundleWithException( "~/bundles/something" ) //...
Run Code Online (Sandbox Code Playgroud)
我使用T4MVC:
var bundleJsLayout = new ScriptBundle("~/bundle/js").Include(
"~" + Links.Scripts.jquery_1_9_0_js,
"~" + Links.Scripts.modernizr_2_6_2_js,
"~" + Links.Scripts.jquery_unobtrusive_ajax_min_js
);
bundleJsLayout.Transforms.Add(new JsMinify());
bundles.Add(bundleJsLayout);
Run Code Online (Sandbox Code Playgroud)