Может ли метод "Bundle.Include" (в System.Web.Optimization, используемом с ASP.NET MVC) вызывать исключение вместо молча игнорировать недостающие файлы? - программирование
Подтвердить что ты не робот

Может ли метод "Bundle.Include" (в System.Web.Optimization, используемом с ASP.NET MVC) вызывать исключение вместо молча игнорировать недостающие файлы?

Как-то можно получить исключение, если отсутствует 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);
                }
            }
        }
    }
}   
4b9b3361

Ответ 1

Я использую этот класс вместо 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 );
    }
}

Затем в конфигурации:

bundles.Add( new ScriptBundleWithException( "~/bundles/something" ) //...

Ответ 2

Если вы посмотрите на источник класса Bundle, вы обнаружите, что .Include просто молча не добавляет файл, если он не существует. Следовательно, ваши утверждения не работают.

Я закончил использование массива имен файлов script и проверил их вручную перед добавлением в комплект.

Ответ 3

Я наткнулся на это и подумал, что я отправлю свое решение. Как отмечали другие, добавление файлов, которые не существуют в пакет, молча игнорируются.

Пример кода:

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.");
}

Затем определите ваши пакеты как обычно, используя массивы для .Include

Ответ 5

Я использую 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);