Make ASP.NET MVC 3 Razor View Engine ignore .vbhtml files

后端 未结 7 897
情深已故
情深已故 2020-12-24 09:02

How can I remove the VB Razor Engine or configure the RazorViewEngine to not use and look for .vbhtml files on disk? For new ASP.NET MVC 3 Razor projects, I always remove th

7条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-24 09:32

    Like @Alex, combining and extending previous solutions.

    Just in case you want to specify extensions for other ViewEngines, inherit from the 'original' and either build or filter (your preference, I just thought filtering seemed more work than starting a fresh list).

    Usage:

    // custom extension(s)
    ViewEngines.Engines.UseOnly(new ExtensionSpecificRazorViewEngine("cshtml"));
    ViewEngines.Engines.UseOnly(new ExtensionSpecificRazorViewEngine("myhtml", "xhtml"));
    
    // filtered from original extensions
    ViewEngines.Engines.UseOnly(new ExtensionSpecificRazorViewEngine(false, "cshtml", "vbhtml"));
    

    Engine-specific:

    /// 
    /// Razor View Engine only expecting the specified extensions
    /// 
    public class ExtensionSpecificRazorViewEngine : RazorViewEngine
    {
        public ExtensionSpecificRazorViewEngine(params string[] extensions) : this(true, extensions) { }
    
        public ExtensionSpecificRazorViewEngine(bool isBuildOrFilter, params string[] extensions) : this(null, isBuildOrFilter, extensions) {}
    
        /// 
        /// Create a new ViewEngine only expecting the provided extension
        /// 
        /// 
        /// 
        /// 
        public ExtensionSpecificRazorViewEngine(IViewPageActivator viewPageActivator, bool isBuildOrFilter, params string[] extensions)
            : base(viewPageActivator)
        {
            if (isBuildOrFilter) this.BuildSpecifically(extensions);
            else this.FilterSpecifically(extensions);
    
            this.FileExtensions = extensions;
        }
    }//---  class   ExtensionSpecificRazorViewEngine
    

    Which uses:

    /// 
    /// Because classes can't inherit from multiple classes, we put the build/filter logic in a helper
    /// that's used by the ViewEngine implementation which inherits from RazorViewEngine or WebFormViewEngine, etc
    /// 
    public static class ExtensionSpecificViewEngineExtensions
    {
        /// 
        /// Given a collection of ViewEngines, clear them and add the indicated engine
        /// ex) ViewEngines.Engines.UseOnly(new RazorViewEngine());
        /// 
        /// list of available engines
        /// the only engine to use
        public static void UseOnly(this ViewEngineCollection engines, IViewEngine engine)
        {
            engines.Clear();
            engines.Add(engine);
        }
    
        /// 
        /// Build the lookup paths specifically for the indicated extension(s)
        /// 
        /// 
        /// 
        public static void BuildSpecifically(this BuildManagerViewEngine engine, string[] extensions)
        {
            engine.AreaMasterLocationFormats =      Build(extensions, "~/Areas/{2}");
            engine.AreaPartialViewLocationFormats = Build(extensions, "~/Areas/{2}");
            engine.AreaViewLocationFormats =        Build(extensions, "~/Areas/{2}");
            engine.FileExtensions =                 Build(extensions);
            engine.MasterLocationFormats =          Build(extensions);
            engine.PartialViewLocationFormats =     Build(extensions);
            engine.ViewLocationFormats =            Build(extensions);
        }
        /// 
        /// Filter the existing, default extensions from the view engine's lookup paths for the indicated extensions
        /// 
        /// 
        /// 
        public static void FilterSpecifically(this BuildManagerViewEngine engine, string[] extensions)
        {
            engine.AreaMasterLocationFormats =      Filter(extensions, engine/*base*/.AreaMasterLocationFormats);
            engine.AreaPartialViewLocationFormats = Filter(extensions, engine/*base*/.AreaPartialViewLocationFormats);
            engine.AreaViewLocationFormats =        Filter(extensions, engine/*base*/.AreaViewLocationFormats);
            engine.FileExtensions =                 Filter(extensions, engine/*base*/.FileExtensions);
            engine.MasterLocationFormats =          Filter(extensions, engine/*base*/.MasterLocationFormats);
            engine.PartialViewLocationFormats =     Filter(extensions, engine/*base*/.PartialViewLocationFormats);
            engine.ViewLocationFormats =            Filter(extensions, engine/*base*/.ViewLocationFormats);
        }
    
        private static string[] Build(string[] extensions, string prefix = "~")
        {
            return extensions.SelectMany(x => new[] {
                    prefix + "/Views/{1}/{0}." + x,
                    prefix + "/Views/Shared/{0}." + x
                }).ToArray();
        }
    
        private static string[] Filter(string[] extensions, params string[] source)
        {
            return source.Where(s => extensions.Any(s.EndsWith)).ToArray();
        }
    }//---  class   ExtensionSpecificViewEngineExtensions
    

提交回复
热议问题