在 MVC 5 中仅针对指定区域在自定义位置搜索视图文件

dea*_*anN 5 asp.net-mvc routing viewengine asp.net-mvc-5

我希望以首先找到我的页面的方式覆盖 MVC5 的“ViewEngine”。我已经失败了。

其次,它只对单个区域 {root}/{area}/{controller}/{action}/{etc.} 进行操作

就我用谷歌搜索而言,我找到了几个主题和答案,但它们不符合我的需要。所以我宁愿在这里问它,也许我有什么不对......

public class CustomAreaViewEngine:RazorViewEngine
{
    public CustomAreaViewEngine()
    {
        var viewLocations = new[]
        {
            "~/App/pages/{1}/{0}.cshtml",
            "~/App/pages/{1}/{0}.vbhtml"
        };
        AreaMasterLocationFormats = viewLocations;
        AreaPartialViewLocationFormats = viewLocations;
        AreaViewLocationFormats = viewLocations;
    }

    public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
    {

        var viewEngineResult = base.FindPartialView(controllerContext, partialViewName, useCache);
        return viewEngineResult;
    }

    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
        controllerContext.RouteData.Values["controller"] = controllerContext.RouteData.Values["controller"].ToString().ToLower();

        var viewEngineResult = base.FindView(controllerContext, viewName, masterName, useCache);
        return viewEngineResult;
    }
}
Run Code Online (Sandbox Code Playgroud)

'FindView' 方法返回空 [第一个问题]

全局配置:

AreaRegistration.RegisterAllAreas();
ViewEngines.Engines.Add(new CustomAreaViewEngine()); // Look View Inside App/Pages/{1}/{0}.cshtml/.vbhtml
Run Code Online (Sandbox Code Playgroud)

我的层次结构

Root
--/App
--/--/pages
--/--/shared (but not that shared)
--/...
--/Area
--/--/View
--/--/--/Controller
--/--/--/View(MVC BASED HIERARCHY, I Don't want to use in most case, and redirect to App)
--/--/--/...
--/--/...
--/Controller
--/View
--/--/...(MVC BASED HIERARCHY)
--/...
Run Code Online (Sandbox Code Playgroud)

编辑:


编辑1:


由于@James Ellis-Jones 的回答,我所做的更改:

图像:我的路线配置: 我的路由配置 区域提供路由配置: 区域提供路由配置 全局配置: 全局配置 我的视图引擎: 我的视图引擎

仍然当我使用时,http://localhost:1422/view/home/index我收到一个错误,它存在于我的另一个家中(视图,与主控制器相关,而不是区域控制器。)它带来了错误的文件。

我发现的另一个问题,但没有奏效

我的命名空间在上次编辑中是错误的,我更改了它们,但它也没有解决。

namespaces: new[] { "RavisHSB.Areas.View.Controllers" }
Run Code Online (Sandbox Code Playgroud)

编辑2:


由于@CarlosFernández 的回答,我所做的更改:

我补充说,ViewEngines.Engines.Clear();它以某种方式领先了一步。但仍然不起作用。

新的 Global.aspx: 我的全球.aspx 我面临这个新错误: 新的错误

Jam*_*nes 1

试试这个:在 RouteConfig.cs 中设置链接到要查找自定义视图位置的控制器的路由,添加以下内容:

var route = routes.MapRoute(<route params here>);
route.DataTokens["area"] = "AreaName";
Run Code Online (Sandbox Code Playgroud)

这将告诉 MVC,当您遵循此路线时,您将进入区域“AreaName”。然后它将随后寻找该区域的视图。当 MVC 在某个区域寻找视图位置时,您的自定义 ViewEngine 只会影响视图位置。否则它不会产生任何效果,因为区域的位置格式列表是它覆盖的唯一格式。