我正在将具有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