我正在编写一个VirtualPathProvider来动态加载我的MVC视图,它们位于不同的目录中。我在MVC (在FileExists中)之前成功地拦截了调用,但在我的VirtualPathProvider中,我得到了原始的、预先路由的url,如下所示:
~/Apps/Administration/Account/LogOn就我个人而言,我知道MVC将寻找
~/Apps/Administration/Views/Account/LogOn.aspx
我应该从文件内容中读取
D:\SomeOtherNonWebRootDirectory\Apps\Administration\Views\Account\LogOn.aspx但我不希望将逻辑硬编码为“添加名为Views的目录并将aspx添加到末尾”。
此逻辑存储在哪里?如何将其放入我的虚拟路径提供程序?
谢谢。如果我说得不够清楚,很抱歉。
发布于 2010-08-30 21:41:49
答案是MVC没有正确地找到我的控制器。如果MVC确实正确地找到了您的控制器,那么VirtualPathProvider应该会处理两个请求:
发布于 2010-08-19 01:46:27
编辑过的
您需要创建一个继承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实例。
发布于 2010-08-19 07:00:17
正如上面提到的SLaks,您需要创建一个自定义视图引擎,并在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());https://stackoverflow.com/questions/3514965
复制相似问题