在浏览类别时,我的网址看起来有些问题。
基本上,这是某种餐饮应用,用户选择Town
(顶级类别),然后为Restaurant
选择town
,在restaurant
内选择food
TownViewController
。
我有RestaurantViewController
,FoodViewController
,Town
,处理Restaurant
,Food
,View
代表的主要操作是{{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 }
);
答案 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