首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET MVC VirtualPathProvider

.NET MVC VirtualPathProvider
EN

Stack Overflow用户
提问于 2010-08-19 01:43:50
回答 3查看 2.6K关注 0票数 2

我正在编写一个VirtualPathProvider来动态加载我的MVC视图,它们位于不同的目录中。我在MVC (在FileExists中)之前成功地拦截了调用,但在我的VirtualPathProvider中,我得到了原始的、预先路由的url,如下所示:

代码语言:javascript
复制
~/Apps/Administration/Account/LogOn

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

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

我应该从文件内容中读取

代码语言:javascript
复制
D:\SomeOtherNonWebRootDirectory\Apps\Administration\Views\Account\LogOn.aspx

但我不希望将逻辑硬编码为“添加名为Views的目录并将aspx添加到末尾”。

此逻辑存储在哪里?如何将其放入我的虚拟路径提供程序?

谢谢。如果我说得不够清楚,很抱歉。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-30 21:41:49

答案是MVC没有正确地找到我的控制器。如果MVC确实正确地找到了您的控制器,那么VirtualPathProvider应该会处理两个请求:

  1. 带有所请求的急性url的初始请求(即,在1中的请求之后,对http://.../Views/Account/LogOn.aspx的后续FileExists检查。调用FileExists返回false。这实际上会返回aspx内容。
票数 0
EN

Stack Overflow用户

发布于 2010-08-19 01:46:27

编辑过的

您需要创建一个继承WebFormViewEngine并设置ViewLocationFormats属性(从VirtualPathProviderViewEngine继承)的类。

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

代码语言:javascript
复制
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实例。

票数 4
EN

Stack Overflow用户

发布于 2010-08-19 07:00:17

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

代码语言:javascript
复制
public class CustomViewEngine : VirtualPathProviderViewEngine

{

代码语言:javascript
复制
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中,您可以按如下方式注册视图引擎:

代码语言:javascript
复制
 ViewEngines.Engines.Clear();
 ViewEngines.Engines.Add(new CustomViewEngine());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3514965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档