使ASP.NET MVC 3 Razor View Engine忽略.vbhtml文件

bka*_*aid 12 asp.net-mvc razor asp.net-mvc-3

如何删除VB Razor Engine或配置RazorViewEngine不使用并在磁盘上查找.vbhtml文件?对于新的ASP.NET MVC 3 Razor项目,我总是删除Application_Start中的WebFormViewEngine,因为我永远不会使用它,因此我不需要它来搜索磁盘上的.aspx,.ascx或.master文件.出于同样的原因,我想避免.vbhtml文件搜索.

tug*_*erk 12

这是您的自定义视图引擎的代码:

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" };
    }
}
Run Code Online (Sandbox Code Playgroud)

在Application_Start方法上注册这个,如下所示:

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CSRazorViewEngine());
Run Code Online (Sandbox Code Playgroud)

  • 不应该设置`FileExtensions`属性吗?`base.FileExtensions = new string [] {"cshtml"};` (5认同)

Dim*_*sov 11

.vbhtml如果我永远不会使用它,为什么删除搜索没有意义?

这是我如何做到的(但我仍然不知道删除vbhtml是一件好事):

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

扩展方法代码:

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();
}
Run Code Online (Sandbox Code Playgroud)


SLa*_*aks 8

这样做没有意义.

但是,如果你真的想,你可以清除ViewEngines,然后注册自己RazorViewEngineFileExtensions设置为".cshtml".

  • 实际上它是无关紧要的,因为至少从版本3开始,VirtualPathProvider会缓存定位视图. (3认同)

Gup*_*R4c 7

我想我会合并来自@tugberk和@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();
    }
}
Run Code Online (Sandbox Code Playgroud)