我将我的MVC 4项目移植到MVC 5之后,我的视图被嵌入,因为无法加载资源。问题是,当mvc搜索视图时,它使用视图引擎继承自BuildManagerViewEngine。此类使用FileExistenceCache并使用VirtualpathProvider与构造函数设置。默认情况下,当我将提供程序更改为我在HostingEnviroment中的自定义时,其MapPathBased提供程序在现有FileExistenceCache实例中没有进行任何更改,而不是我的视图未建立。
我在Route配置类中更改了VirtualpathProvider,但是它更晚了。什么是更好的地方?
由于
答案 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