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