我的路由无效

时间:2013-05-15 17:34:55

标签: c# asp.net-mvc-4 asp.net-mvc-routing

我有一个像这样的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的视图。

如果不使用区域,我需要做什么?

3 个答案:

答案 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就会找到该视图。