我将我的MVC4项目移植到MVC5,之后我的视图被嵌入,因为资源无法加载。问题是当mvc搜索视图时,它使用的是继承自BuildManagerViewEngine的视图引擎。这个类通过构造函数将FileExistenceCache与VirtualpathProvider一起使用。默认情况下,当我在HostingEnviroment中将provider更改为我的自定义提供程序时,不会对现有的FileExistenceCache实例进行任何更改,因为我的视图不是建立的。
我在路由配置类中更改了VirtualpathProvider,但为时已晚。有什么地方更适合做这件事?
谢谢
发布于 2013-10-26 10:43:46
而是将现有的“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方法中交换提供程序:
public static class MyInitializer
{
public static void Initialize() {
HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider());
}
}Phil Haack有一篇很好的帖子:Three Hidden Extensibility Gems in ASP.NET 4
https://stackoverflow.com/questions/19543103
复制相似问题