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();它以某种方式领先了一步。但仍然不起作用。
试试这个:在 RouteConfig.cs 中设置链接到要查找自定义视图位置的控制器的路由,添加以下内容:
var route = routes.MapRoute(<route params here>);
route.DataTokens["area"] = "AreaName";
Run Code Online (Sandbox Code Playgroud)
这将告诉 MVC,当您遵循此路线时,您将进入区域“AreaName”。然后它将随后寻找该区域的视图。当 MVC 在某个区域寻找视图位置时,您的自定义 ViewEngine 只会影响视图位置。否则它不会产生任何效果,因为区域的位置格式列表是它覆盖的唯一格式。
| 归档时间: |
|
| 查看次数: |
2146 次 |
| 最近记录: |