asp.net-mvc – 仅在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;
    }
}

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

全球配置:

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

我的层次结构

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)
--/...

EDITS:

EDIT1:

由于@James Ellis-Jones的回答我做了改变:

图片:
 我的路线配置:
 《asp.net-mvc – 仅在MVC 5中的指定区域中搜索自定义位置的视图文件》
 区域提供的路由配置:
 《asp.net-mvc – 仅在MVC 5中的指定区域中搜索自定义位置的视图文件》
 全球配置:
 《asp.net-mvc – 仅在MVC 5中的指定区域中搜索自定义位置的视图文件》
 我的视图引擎:
 《asp.net-mvc – 仅在MVC 5中的指定区域中搜索自定义位置的视图文件》

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

我想出的另一个问题,也没有用过

我的命名空间在上次编辑中是错误的,我改变了它们,但它也没有成功.

namespaces: new[] { "RavisHSB.Areas.View.Controllers" }

EDIT2:

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

我添加了ViewEngines.Engines.Clear();它以某种方式领先一步.但仍然无法正常工作.

新的Global.aspx:
《asp.net-mvc – 仅在MVC 5中的指定区域中搜索自定义位置的视图文件》
我面对这个新错误:
《asp.net-mvc – 仅在MVC 5中的指定区域中搜索自定义位置的视图文件》

最佳答案 试试这个:在RouteConfig.cs中你要设置链接到你想要找到自定义视图位置的控制器的路由,添加:

var route = routes.MapRoute(<route params here>);
route.DataTokens["area"] = "AreaName";

这将告诉MVC当你遵循这条路线时,你将进入区域’AreaName’.然后它将在该区域寻找观点.您的自定义ViewEngine仅在MVC在某些区域中查找它们时才会影响视图位置.否则它将没有任何效果,因为区域的位置格式列表是它覆盖的唯一.

点赞