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

后端 未结 7 893
情深已故
情深已故 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:29

    There is no point in doing this.

    However, if you really want to, you can clear ViewEngines, then register your own RazorViewEngine with FileExtensions set to ".cshtml".

    0 讨论(0)
  • 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:

    /// <summary>
    /// Razor View Engine only expecting the specified extensions
    /// </summary>
    public class ExtensionSpecificRazorViewEngine : RazorViewEngine
    {
        public ExtensionSpecificRazorViewEngine(params string[] extensions) : this(true, extensions) { }
    
        public ExtensionSpecificRazorViewEngine(bool isBuildOrFilter, params string[] extensions) : this(null, isBuildOrFilter, extensions) {}
    
        /// <summary>
        /// Create a new ViewEngine only expecting the provided extension
        /// </summary>
        /// <param name="viewPageActivator"></param>
        /// <param name="isBuildOrFilter"></param>
        /// <param name="extensions"></param>
        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:

    /// <summary>
    /// 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
    /// </summary>
    public static class ExtensionSpecificViewEngineExtensions
    {
        /// <summary>
        /// <para>Given a collection of ViewEngines, clear them and add the indicated engine</para>
        /// <example>ex) <code>ViewEngines.Engines.UseOnly(new RazorViewEngine());</code></example>
        /// </summary>
        /// <param name="engines">list of available engines</param>
        /// <param name="engine">the only engine to use</param>
        public static void UseOnly(this ViewEngineCollection engines, IViewEngine engine)
        {
            engines.Clear();
            engines.Add(engine);
        }
    
        /// <summary>
        /// Build the lookup paths specifically for the indicated extension(s)
        /// </summary>
        /// <param name="engine"></param>
        /// <param name="extensions"></param>
        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);
        }
        /// <summary>
        /// Filter the existing, default extensions from the view engine's lookup paths for the indicated extensions
        /// </summary>
        /// <param name="engine"></param>
        /// <param name="extensions"></param>
        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
    
    0 讨论(0)
  • 2020-12-24 09:42

    Why is there no point in removing search in .vbhtml if I'm never going to use it?

    Here is how I do it (but I still don't know is it a good thing to remove vbhtml):

    protected void Application_Start()
    {
        ViewEngines.Engines.Clear();
        ViewEngines.Engines.Add(new RazorViewEngine().DisableVbhtml());
    
        ...
    }
    

    Extension method code:

    public static RazorViewEngine DisableVbhtml(this RazorViewEngine engine)
    {
        engine.AreaViewLocationFormats = FilterOutVbhtml(engine.AreaViewLocationFormats);
        engine.AreaMasterLocationFormats = FilterOutVbhtml(engine.AreaMasterLocationFormats);
        engine.AreaPartialViewLocationFormats = FilterOutVbhtml(engine.AreaPartialViewLocationFormats);
        engine.ViewLocationFormats = FilterOutVbhtml(engine.ViewLocationFormats);
        engine.MasterLocationFormats = FilterOutVbhtml(engine.MasterLocationFormats);
        engine.PartialViewLocationFormats = FilterOutVbhtml(engine.PartialViewLocationFormats);
        engine.FileExtensions = FilterOutVbhtml(engine.FileExtensions);
    
        return engine;
    }
    
    private static string[] FilterOutVbhtml(string[] source)
    {
        return source.Where(s => !s.Contains("vbhtml")).ToArray();
    }
    
    0 讨论(0)
  • 2020-12-24 09:45

    I figured I'd merge the examples from @tugberk and @Dimps:

    public class CSHtmlRazorViewEngine : RazorViewEngine {
        public CSHtmlRazorViewEngine()
            : base() {
            this.AreaMasterLocationFormats = Filter(base.AreaMasterLocationFormats);
            this.AreaPartialViewLocationFormats = Filter(base.AreaPartialViewLocationFormats);
            this.AreaViewLocationFormats = Filter(base.AreaViewLocationFormats);
            this.FileExtensions = Filter(base.FileExtensions);
            this.MasterLocationFormats = Filter(base.MasterLocationFormats);
            this.PartialViewLocationFormats = Filter(base.PartialViewLocationFormats);
            this.ViewLocationFormats = Filter(base.ViewLocationFormats);
        }
    
        private static string[] Filter(
            string[] source) {
            return source.Where(
                s =>
                    s.Contains("cshtml")).ToArray();
        }
    }
    
    0 讨论(0)
  • 2020-12-24 09:46

    This is the code for your custom view engine:

    public class CSRazorViewEngine : RazorViewEngine {
    
        public CSRazorViewEngine() {
    
            base.AreaViewLocationFormats = new string[] { 
                "~/Areas/{2}/Views/{1}/{0}.cshtml",
                "~/Areas/{2}/Views/Shared/{0}.cshtml"
            };
    
            base.AreaMasterLocationFormats = new string[] { 
                "~/Areas/{2}/Views/{1}/{0}.cshtml",
                "~/Areas/{2}/Views/Shared/{0}.cshtml"
            };
    
            base.AreaPartialViewLocationFormats = new string[] { 
                "~/Areas/{2}/Views/{1}/{0}.cshtml",
                "~/Areas/{2}/Views/Shared/{0}.cshtml"
            };
    
            base.ViewLocationFormats = new string[] {
                "~/Views/{1}/{0}.cshtml",
                "~/Views/Shared/{0}.cshtml"
            };
    
            base.PartialViewLocationFormats = new string[] {
                "~/Views/{1}/{0}.cshtml",
                "~/Views/Shared/{0}.cshtml"
            };
    
            base.MasterLocationFormats = new string[] {
                "~/Views/{1}/{0}.cshtml",
                "~/Views/Shared/{0}.cshtml"
            };
    
            base.FileExtensions = new string[] { "cshtml" };
        }
    }
    

    Register this on Application_Start method like this:

    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new CSRazorViewEngine());
    
    0 讨论(0)
  • 2020-12-24 09:48

    A summary from above with a single class.

    Use it like this:

    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new FilteredRazorViewEngine("cshtml"));
    

    Class:

    public class FilteredRazorViewEngine : RazorViewEngine
    {
        private string _extension;
    
        public FilteredRazorViewEngine(string viewTypeExtension)
            : base()
        {
            _extension = viewTypeExtension;
    
            AreaMasterLocationFormats = Filter(base.AreaMasterLocationFormats);
            AreaPartialViewLocationFormats = Filter(base.AreaPartialViewLocationFormats);
            AreaViewLocationFormats = Filter(base.AreaViewLocationFormats);
            FileExtensions = Filter(base.FileExtensions);
            MasterLocationFormats = Filter(base.MasterLocationFormats);
            PartialViewLocationFormats = Filter(base.PartialViewLocationFormats);
            ViewLocationFormats = Filter(base.ViewLocationFormats);
        }
    
        private string[] Filter(string[] source)
        {
            return source.Where(
                s =>
                    s.Contains(_extension)).ToArray();
        }
    }
    
    0 讨论(0)
提交回复
热议问题