asp.net-mvc - style - ~/ bundles modernizr
¿Puede el método “Bundle.Include”(en System.Web.Optimization usado con ASP.NET MVC) lanzar una excepción en lugar de ignorar silenciosamente los archivos que faltan? (5)
¿Es posible obtener una excepción si falta un archivo javascript o css?
He intentado con el código de abajo pero nunca lanza una excepción ...
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);
}
}
}
}
}
Me encontré con esto y pensé que iba a presentar mi solución. Como otros han mencionado, la adición de archivos que no existen a un paquete se ignora silenciosamente.
Código de ejemplo:
string[] jsFiles = { "~/js/file1.js", "~/js/file2.js" };
string[] cssFiles = { "~/css/file1.css", "~/css/file2.css" };
List<string> allFiles = new List<string>();
allFiles.AddRange(jsFiles);
allFiles.AddRange(cssFiles);
var server = HttpContext.Current.Server;
foreach(var file in allFiles) {
if(!File.Exists(server.MapPath(file))
throw new FileNotFoundException("File " + file + " was not found.");
}
Luego defina sus paquetes como de costumbre, usando los arreglos para .Include
Por favor vea mi respuesta aquí: Asp.Net MVC Bundling, la mejor manera de detectar el archivo faltante . Cuenta con soporte para comodines de ASP.NET en ruta.
Si observa la fuente de la clase Bundle, encontrará que .Include simplemente no agrega el archivo si no existe. Por lo tanto sus afirmaciones no funcionan.
Terminé usando una matriz de nombres de archivos de script y revisándolos manualmente antes de agregarlos al paquete.
Yo uso 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);
Yo uso esta clase en lugar de 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 );
}
}
Luego en la configuración:
bundles.Add( new ScriptBundleWithException( "~/bundles/something" ) //...