2010-08-18 130 views
2

我正在写一个VirtualPathProvider来动态加载我的MVC视图,这些视图位于不同的目录中。我成功地拦截MVC(在FILEEXISTS)之前调用,但在我的VirtualPathProvider,我得到的原料,前路由的网址,如:ASP .NET MVC VirtualPathProvider

~/Apps/Administration/Account/LogOn 

就个人而言,我知道,MVC将寻找

~/Apps/Administration/Views/Account/LogOn.aspx

,我应该从

D:\SomeOtherNonWebRootDirectory\Apps\Administration\Views\Account\LogOn.aspx 

读取文件内容,但我宁愿不要硬编码到“添加指定目录视图和广告逻辑d aspx到最后“。

这个逻辑存储在哪里,我怎样才能把它放到我的虚拟路径提供者中?

谢谢。对不起,如果我不清楚。

回答

0

答案是,MVC并没有发现我的控制器正常。如果MVC确实发现其实你的控制器正常,应该有通过的VirtualPathProvider处理两个请求:

  1. 与(http://.../Account/LogOn即)要求acutal URL的初始请求。

  2. 后续的FileExists检查http://.../Views/Account/LogOn.aspx,在1.中的请求返回false后调用FileExists。这实际上会回退aspx内容。

+1

第一个(它必须返回false以阻止IIS试图将其作为静态文件提供,而不是运行控制器操作)之后FileExists被同时调用“〜/ Views/Account/LogOn.aspx”和“/ AppName/Views /Account/LogOn.aspx“ - 这两个都需要返回true。 – 2011-01-01 10:07:45

4

编辑

你需要做的是继承WebFormViewEngine并设置ViewLocationFormats属性(从VirtualPathProviderViewEngine继承)类。

的默认值可以在MVC的源代码中找到:

public WebFormViewEngine() { 
    MasterLocationFormats = new[] { 
     "~/Views/{1}/{0}.master", 
     "~/Views/Shared/{0}.master" 
    }; 

    AreaMasterLocationFormats = new[] { 
     "~/Areas/{2}/Views/{1}/{0}.master", 
     "~/Areas/{2}/Views/Shared/{0}.master", 
    }; 

    ViewLocationFormats = new[] { 
     "~/Views/{1}/{0}.aspx", 
     "~/Views/{1}/{0}.ascx", 
     "~/Views/Shared/{0}.aspx", 
     "~/Views/Shared/{0}.ascx" 
    }; 

    AreaViewLocationFormats = new[] { 
     "~/Areas/{2}/Views/{1}/{0}.aspx", 
     "~/Areas/{2}/Views/{1}/{0}.ascx", 
     "~/Areas/{2}/Views/Shared/{0}.aspx", 
     "~/Areas/{2}/Views/Shared/{0}.ascx", 
    }; 

    PartialViewLocationFormats = ViewLocationFormats; 
    AreaPartialViewLocationFormats = AreaViewLocationFormats; 
} 

您应该然后清除ViewEngines.Engines收集和您的ViewEngine实例添加到它。

+0

你能更具体吗?谢谢。 – Jeff 2010-08-18 17:52:19

+0

谢谢。我如何从这些格式字符串中获得我的VirtualPathProvider知道从哪里读取文件? – Jeff 2010-08-18 18:25:55

+0

换句话说,如果我的VirtualPathProvider获取〜/ Apps/Administration/Account/LogOn的请求,我如何使用上述信息来知道如何查找D:\ SomeOtherPath \ Apps \ Administrations \ Views \ Account \ LogOn.aspx ? – Jeff 2010-08-18 19:10:59

0

由于上面提到的SLak,您需要创建一个自定义视图引擎并在FindView方法中添加您的视图查找逻辑。

public class CustomViewEngine : VirtualPathProviderViewEngine 

{

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 

    { 
     //Set view path 
     string viewPath = GetCurrentViewPath(); 

     //Set master path (if need be) 
     string masterPath = GetCurrentMasterPath(); 

     return base.FindView(controllerContext, viewPath, masterPath, useCache); 
    } 

}

在Application_Start,你可以这样注册您的视图引擎:

ViewEngines.Engines.Clear(); 
ViewEngines.Engines.Add(new CustomViewEngine());