1

我一直在寻找解决方案来解决我的问题。发现了很多类似的问题,但没有一个能为我提供解决方案。ASP.Net MVC 2区域,子区域和路线

我想在一个区域内注册一个区域。然而,这种方法可以“部分地”把我的路由搞砸了。在他们注册的顺序,考虑FooBar的和Foo注册

我的路线登记从AreaRegistrations

现身
routes.MapRoute("FooBar_default", 
      "Foo/Bar/{controller}/{action}", 
      new { area = "Foo/Bar", controller = "Home", action = "Index"}, 
      new[] { BarHomeControllerType.Namespace } 
); 

    routes.MapRoute("Foo_default", 
      "Foo/{controller}/{action}/{id}", 
      new { area = "Foo", controller = "Start", action = "Index", id = UrlParameter.Optional }, 
      new { controller = new NotSubArea()}, 
      new[] { typeof(StartController).Namespace } 
     ); 

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute("PagesRoute", "Pages/{action}", new { controller = "Pages", Action "Index" }).DataTokens["UseNamespaceFallback"] = false; 

    routes.MapRoute("Default", // Route name 
      "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new[] { typeof(HomeController).Namespace } 
      ).DataTokens["UseNamespaceFallback"] = false; 

现在出现以下问题。当去网站/美孚/或网站/美孚/酒吧在这些页面上的链接生成正确使用:

!{Html.ActionLink<HomeController>(c => c.Index(),"Home", new { area = "Foo/Bar"})} 
    or 
    !{ Url.Action("Index", "Home", new { area = "Foo/Bar"}) } //or a different area 

但是当我使用这在我的主要页面,换句话说网站/或网站/主页等。

!{Html.ActionLink<HomeController>(c => c.Index(),"Home", new { area = ""})} 
    or 
    !{ Url.Action("Index", "Home", new { area = ""}) } 
    //or with no area identifier specified 

它生成Url:Website/Foo/Bar/Home等......哪一个是错的。

当我删除Foo/Bar的区域注册时,它全部重新运行。直接去到网站/首页/关于或网站/首页显示正确的页面,所以即时猜测内部UrlHelper挑选错误的路线来呈现。

我尝试切换FooBar_default和Foo_Default路由的顺序,以便Foo_default路由在FooBar_default路由之前注册,但是此区域不再工作(找不到资源)并且链接仍然生成不正确。

我觉得最奇怪的是,删除Foo/Bar注册可以解决问题。我希望有人可以在这个问题上提出一些见解..

+0

将注册更改为Foo-Bar而不是使用/没有区别.. – Danthar 2010-07-19 10:17:08

回答

1

你需要了解的是,Area只是一个路由概念,微软已经整齐地包装了概念或UrlRouting让人们开始。

实际上,您可以根据自己的需求获取MVC框架来路由您的请求,然而您喜欢。

你可能需要看看干什么,写你自己的RouteHandler。这将使您能够正确地指导MVC框架如何根据您的要求路由任何请求。

请参阅this answerasp.net mvc complex routing for tree path作为一个例子,让你开始。

chris166概述了我实现自己的IRouteHandler,并映射你的路线来使用它,而应该得到你所需要的。它比使用盒子解决方案更加努力,但应该让你获得更好的结果。

routes.MapRoute(
    "Tree", 
    "Tree/{*path}", 
    new { controller = "Tree", action = "Index" }) 
      .RouteHandler = new TreeRouteHandler();