2

我正在编写一个 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 添加到末尾”。

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

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

4

3 回答 3

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 实例添加到其中。

于 2010-08-18T17:46:26.787 回答
0

正如上面提到的 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());
于 2010-08-18T23:00:16.640 回答
0

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

  1. 带有请求的实际 url 的初始请求(即http://.../Account/LogOn)。

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

于 2010-08-30T13:41:48.600 回答