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

Per*_*ian 4 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?我需要允许路由来处理这个问题.我们的默认Show路线是:

routes.MapRoute(
               "ArtistDefault",
               "artists/{artistName}",
               new { controller = "Artists", action = "Show", artistName = ""}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

Bra*_*son 8

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


dat*_*cop 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 = "" }
);               
Run Code Online (Sandbox Code Playgroud)