.NET MVC类别树URL结构

时间:2014-02-05 17:15:52

标签: .net asp.net-mvc url asp.net-mvc-routing categories

在浏览类别时,我的网址看起来有些问题。

基本上,这是某种餐饮应用,用户选择Town(顶级类别),然后为Restaurant选择town,在restaurant内选择food TownViewController

我有RestaurantViewControllerFoodViewControllerTown,处理RestaurantFoodView代表的主要操作是{{1 (所以在每个控制器中)。

要查看我拥有的所有城镇www.catering.com/Town,那很好(如果它/城镇没有将控制器重命名为Towns也不会硬编码新路线会更好) -

要查看所选城镇的所有餐馆(在这种情况下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 个答案:

答案 0 :(得分: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。语法类似,但略有不同。您可以使用基于HTTP方法的多个属性,而不是使用Route

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

答案 1 :(得分:1)

您是否尝试过使用MVC区域进一步细分您的网站?以下是解释用法的链接:Walkthrough: Organizing an ASP.NET MVC Application using Areas