在MVC 5中更改VirtualPathProvider

时间:2013-10-23 13:31:55

标签: asp.net-mvc-5

我将我的MVC 4项目移植到MVC 5之后,我的视图被嵌入,因为无法加载资源。问题是,当mvc搜索视图时,它使用视图引擎继承自BuildManagerViewEngine。此类使用FileExistenceCache并使用VirtualpathProvider与构造函数设置。默认情况下,当我将提供程序更改为我在HostingEnviroment中的自定义时,其MapPathBased提供程序在现有FileExistenceCache实例中没有进行任何更改,而不是我的视图未建立。

我在Route配置类中更改了VirtualpathProvider,但是它更晚了。什么是更好的地方?

由于

1 个答案:

答案 0 :(得分:2)

而是将现有的“IViewEngine”子类化为使用自定义VirtualPathProvider。然后在Global.asax文件中注册您的自定义引擎。

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        ViewEngines.Engines.Add(new MyViewEngine());
    }

    private class MyVirtualPathProvider: VirtualPathProvider {}

    private class MyViewEngine : RazorViewEngine
    {
        public MyViewEngine()
        {
            this.VirtualPathProvider = new MyVirtualPathProvider();
        }
    }
}

通过这种方式,您还可以通过在Engines集合中的适当位置添加引擎来控制哪个引擎具有优先级。

作为替代方案,您可以使用PreApplicationStartMethodAttribute替换VirtualPathProvider,但对于所有标准IViewEngine,这将全局更改提供商。

[assembly: PreApplicationStartMethod(
    typeof(MyNamespace.MyInitializer), "Initialize")]

然后在类中的公共静态方法中交换提供程序:

public static class MyInitializer
{
    public static void Initialize() { 
        HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider());
    }
}

菲尔·哈克(Phil Haack)有一篇好文章:Three Hidden Extensibility Gems in ASP.NET 4