2014-02-05 34 views
0

我有一些问题,我的网址看看经历类别一会儿。.NET MVC分类树URL结构

基本上,这是某种形式的餐饮应用,其中用户选择Town(最高类别),然后选择Restauranttown,和里面restaurant他可以看到food

我有TownViewControllerRestaurantViewControllerFoodViewController和用于处理的TownRestaurant表示主要动作,FoodView(所以在每一个控制器)。

,看我有www.catering.com/Town所有城镇和多数民众赞成罚款(虽然这将是更好的,如果不重命名控制器到城镇,也没有硬编码新航线的/城镇 - 如果可能的话)

要查看所有餐馆选择镇(驻这个案例ID = 1)我有www.catering.com/Restaurant/View/1。现在这是问题。实际上这应该是选择餐厅和食物代表的路线,餐馆代表应该是www.catering.com/Town/View/1。所以实际上总是超类应该在URL中。

因为在最后我有www.catering.com/Food/View/1并没有任何意义,因为我正在浏览餐厅没有与ID = 1的食物。

是否有某种方式这可以是固定的路线,除了经典的硬编码?我设法解决了一些硬编码路由,但是我的客户说它不是很好的方法,因为它可能会在较大的项目中变得非常混乱。

我做这样的:

routes.MapRoute(
     "Restaurant", 
     "Town/View/{id}", 
     new { controller = "Restaurant", action = "View", id = UrlParameter.Optional } 
    ); 

    routes.MapRoute(
     "Food", 
     "Restaurant/View/{id}", 
     new { controller = "Food", action = "View", id = UrlParameter.Optional } 
    ); 

回答

2

我建议属性的路由。如果这是一个MVC 5项目,你只需要进入RouteConfig.cs在你RegisterRoutes方法,取消/添加一行:

routes.MapMvcAttributeRoutes(); 

然后,您可以使用Route属性和RoutePrefix属性指定的确切网址你要。例如:

[RoutePrefix("Town/View/{townId}")] 
public class RestaurantController 
{ 
    [Route("")] 
    public ActionResult Index(int townId) 
    { 
     ... 
    } 
} 

如果您未运行MVC 5,则可以添加nuget软件包AttributeRouting。语法相似,但略有不同。而不是使用Route,您使用一个基于HTTP方法的几个属性:

[RoutePrefix("Town/View/{townId}")] 
public class RestaurantController 
{ 
    [GET("")] 
    public ActionResult Index(int townId) 
    { 
     ... 
    } 
} 
+0

谢谢你的回答,我会尽快检查一下我的电脑。 –