我正在将具有4级目录结构的网站转换为Visual Studio 2010中的MVC3。我发现的示例包含带有{controller} / {action} / {id}的路由。

考虑将目录结构级别分为几部分,我需要做的是处理如下所示的结构:
mysite.com/{section1}/{section2}/{section3}/{section4}

索引文件位于每个部分,其操作方式与该部分的介绍和目录相同。目前,我预计第4级以上的网页都不会。

我的偏好是使用XML网站地图,并编写一些代码块来处理该网站地图中的各种页面目录结构。我已经使用WebForms成功完成了此操作,但确实希望使用MVC3做到这一点。我想念的最大部分是这样做的一个很好的例子。

现在,我什至无法将其路由到Section2。这是在我的Global.asax中。

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

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


这是在我的Section1控制器中。

public class Section1Controller : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Section2(string id)
    {
        return View("Section2/" + id);
    }
}


我可以成功导航到Section1(即http://localhost:123/section1/)。但是当我输入Section2(http:// localhost:123 / section1 / section2)时,出现此错误:


  找不到视图“ Section2 /”或其主视图,或者没有视图引擎
  支持搜索的位置。以下位置是
  搜索:〜/ Views / section1 / Section2 / .aspx
  〜/ Views / section1 / Section2 / .ascx〜/ Views / Shared / Section2 / .aspx
  〜/ Views / Shared / Section2 / .ascx〜/ Views / section1 / Section2 / .cshtml
  〜/ Views / section1 / Section2 / .vbhtml〜/ Views / Shared / Section2 / .cshtml
  〜/ Views / Shared / Section2 / .vbhtml


我希望这一切都有意义。如果有更好的方法可以解决此问题,请告诉我。

我的直接问题是要使用第1节级别的控制器,将其导航到每个节(1、2、3和4)的索引页。如果不可能,那么有效的方法是什么?无论哪种方式,我可能都需要看一个代码示例。

其次,在MVC3网站上是否有一种不错的方法来利用站点地图?如果是这样,我将使用哪种方法?

谢谢你的帮助。

最佳答案

您的路线存在问题,因为它位于默认路线之后。 MVC将在匹配的第一条路线处停止,这始终是默认路线。您需要通过先声明将其移到集合中默认路由的上方。

如果这些部分是固定的,则可以完全通过路由解决问题。那很容易做到。

基于控制器的解决方案无法正常工作的原因是,您试图将ID作为视图名称的一部分进行传递。那不是它的工作原理。您将执行以下操作:

public ActionResult Section2(string id)
{
    return View("Section2", new { id=id });
}


您还可以创建区域,这将创建包含完整MVC站点的子区域。区域是一个很棒的功能,但可能并非在所有情况下都是您想要的。

还有可移植区域,它使您可以将区域分隔成各自的组件,从而分隔成各自的项目。

您也可以通过使用所谓的“子句”来解析自己的URL,以解析控制器名称之后的所有内容。

关于站点地图,您可以尝试一下

https://github.com/maartenba/MvcSiteMapProvider

10-04 16:52