0

我有一个这样的视图文件夹结构:

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}
            );

但是没有找到视图的控制器。我试过 localhost/Rooms 和 localhost/Rooms/Resorts/Index -

两者都具有相同的结果。

我错过了什么?

编辑:根据业务需求,我需要 URLS 看起来像房间/度假村/套房等,我需要在不使用区域的情况下执行此操作。我将有多个使用相同操作名称的 URL,例如 Rooms/Resorts/Suites、Rooms/Suites/Suites、Rooms/AwesomeSuites/Suites。因此,使用子文件夹是有必要的——组织并拥有多个名为 Suites 的视图。

在不使用区域的情况下我需要做的事情是否可行?

4

3 回答 3

0

好吧,据我所知,路由并不关心您创建的那个额外文件夹(房间),因此它很可能会尝试从 Views/Resorts/ 而不是 Views/Rooms/Resorts 解析视图。如果你需要这种分离,比如在结构的其他地方有一个 ResortsController,你应该使用 Areas。例如,您可以创建一个名为 Rooms 的区域!

于 2013-05-15T17:40:50.793 回答
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 就会找到视图。

于 2013-05-16T17:44:42.083 回答
0

你能试一下吗:

routes.MapRoute("Rooms", "Rooms/Resorts/{id}", new {controller = "Resorts", action = "Index", id = UrlParameter.Optional});

于 2013-05-15T23:18:58.523 回答