我有一个像这样的View文件夹结构:
Views
Rooms
Resorts
Index.cshtml
Suites.cshtml
.....
我希望控制器文件夹结构匹配
Controllers
Rooms
ResortsController.cs
我添加了一个新的mapRoute
routes.MapRoute(
name: "Rooms",
url: "Rooms/{controller}/{action}/{id}",
defaults: new {controller = "Resorts", action = "Index", id = UrlParameter.Optional}
);
但是找不到View的控制器。我试过了 localhost / Rooms和 localhost /客房/度假村/指数 -
两者都有相同的结果。
我错过了什么?
编辑:我需要URLS看起来像每个业务要求的客房/度假村/套房等,我需要在不使用区域的情况下执行此操作。我将使用多个使用相同操作名称的URL,例如客房/度假村/套房,客房/套房/套房,客房/ AwesomeSuites / Suites。因此,有一点需要使用子文件夹 - 组织并拥有多个名为Suites的视图。如果不使用区域,我需要做什么?
答案 0 :(得分:0)
嗯,据我所知,路由不关心您创建的额外文件夹(Rooms),因此很可能尝试从Views / Resorts /而不是Views / Rooms / Resorts解析视图。如果您需要这种分离,比如在结构中的其他位置安装ResortsController,您应该使用区域。例如,您可以创建一个名为Rooms!
的区域答案 1 :(得分:0)
你可以尝试:
routes.MapRoute( “房间”, “客房/度假村/(编号)”, new {controller =“Resorts”,action =“Index”,id = UrlParameter.Optional} );
答案 2 :(得分:0)
我解决了我的问题。在我的问题中使用我的映射路由,并保持我实现的文件夹结构完整,我创建了一个自定义视图引擎,它将动态创建一个查找视图的路径。
public class CustomRazorViewEngine : RazorViewEngine
{
public CustomRazorViewEngine()
{
ViewLocationFormats = new string[] { "~/Views/%1/{1}/{0}.cshtml"};
MasterLocationFormats = new string[] { "~/Views/%1/{1}/{0}.cshtml",
"~/Views/Shared/%1/{0}.cshtml"};
PartialViewLocationFormats = new string[] { "~/Views/Rooms/{1}/{0}.cshtml",
"~/Views/Shared/%1/{0}.cshtml"};
FileExtensions = new string[] { "cshtml"};
}
protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
{
var path = GetPath(controllerContext.Controller.GetType().Namespace);
return base.CreatePartialView(controllerContext, partialPath.Replace("%1", path));
}
protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
{
var path = GetPath(controllerContext.Controller.GetType().Namespace);
return base.CreateView(controllerContext, viewPath.Replace("%1", path), masterPath.Replace("%1", path));
}
protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
{
var path = GetPath(controllerContext.Controller.GetType().Namespace);
return base.FileExists(controllerContext, virtualPath.Replace("%1", path));
}
private string GetPath(string nameSpace)
{
var split = nameSpace.Split('.');
int startingIndex = 0;
StringBuilder sb = new StringBuilder();
foreach(string s in split)
{
startingIndex++;
if (s == "Controllers")
{
break;
}
}
for(int x = startingIndex; x < split.Length; x++)
{
sb.Append(split[x]);
if (x != split.Length - 1)
{
sb.Append("/");
}
}
return sb.ToString();
}
因此,只要View文件夹和Controllers文件夹中的文件夹结构相同,CustomRazorViewEngine就会找到该视图。