ASP.Net MVC路由动作名称冲突

时间:2009-04-30 17:54:12

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

我们有一个处理艺术家和场地的网站,我们正在ASP.net MVC中开发它。

我们将艺术家视图放在文件夹(Views / Artists / ..),ArtistsController,ArtistsRepository中,并遵守REST动作名称,如Show,New,Delete等。

当我们第一次模拟网站时,一切都在我们的测试环境中运行良好,因为我们的测试网址是/ artists / Show / 1209 但我们需要改变这个,所以网站显示为/ artists / Madonna和/ artists / Foo-Fighters等

但是,我们如何区分有效的艺术家名称和该控制器的动作名称?!例如,艺术家/ PostComment或艺术家/ DeleteComment?我需要允许路由来处理这个问题。我们的默认展示路线是:

routes.MapRoute(
               "ArtistDefault",
               "artists/{artistName}",
               new { controller = "Artists", action = "Show", artistName = ""}

解决这个问题的一种方法是让我们的网站明显地运行/艺术家,但我们的控制器重命名为singular - ArtistController - 而不是ArtistsController。这会违背我们开始时的命名约定(但是嘿!)。

您还有其他建议吗?如果可能的话,我们也可以根据动词进行路由(因此PostComment将是一个POST,所以我们可以路由到该动作),但我不确定这是否可取,更不用说可能了。

由于

2 个答案:

答案 0 :(得分:8)

MapRoute的第4个参数允许您指定值的限制。您可以在此之前添加一个路线,用于“artists / {action} / {id}”,并限制有效的操作值;如果没有匹配您的某个操作,它将会转到下一个匹配艺术家姓名的路线。

答案 1 :(得分:6)

您实际上会定义多个路线...控制器中定义的操作将首先显示,默认位于底部。我喜欢把路由定义看作是一个“大'ole switch语句”,其中第一个规则满足胜利。

routes.MapRoute(
               "ArtistPostComment",
               "artists/PostComment/{id}",
               new { controller = "Artists", action = "PostComment", id = "" }
);
routes.MapRoute(
               "ArtistDeleteComment",
               "artists/DeleteComment/{id}",
               new { controller = "Artists", action = "DeleteComment", id = "" }
);
routes.MapRoute(
               "ArtistDefault",
               "artists/{artistName}",
               new { controller = "Artists", action = "Show", artistName = "" }
);