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

4
我们有一个与艺术家和场馆相关的网站,正在使用ASP.net MVC进行开发。
我们将艺术家视图存放在一个文件夹中(Views/Artists/..),有一个ArtistsController、ArtistsRepository,并遵循REST动作名称,如Show、New、Delete等。
在我们最初模拟网站时,我们在测试环境下的URL地址是/artists/Show/1209,一切正常。
但现在我们需要更改这种方式,让网站显示为/artists/Madonna和/artists/Foo-Fighters等。
然而,我们该如何区分有效的艺术家名称和该控制器操作的名称?例如,artists/PostComment或artists/DeleteComment?
我需要允许路由处理这个问题。我们默认的Show路由如下:
routes.MapRoute(
               "ArtistDefault",
               "artists/{artistName}",
               new { controller = "Artists", action = "Show", artistName = ""}

解决这个问题的一种方法是让我们的网站在 /artists 上可见,但将控制器重命名为单数形式 - ArtistController - 而不是 ArtistsController。这将违反我们开始时采用的命名约定(但是嘿!)。

你有其他建议吗?如果可能的话,我们还可以根据动词进行路由(例如 PostComment 将是一个 POST 请求,因此我们或许可以路由到该操作),但我不确定这是否明智,更不用说是否可能了。

谢谢

2个回答

8

MapRoute方法的第四个参数允许您指定值的限制。您可以在此之前添加一个路由,用于“artists/{action}/{id}”,并对操作(action)的有效值添加限制;如果无法匹配其中一个操作,则会跳过该路由,继续匹配下一个路由,该路由将匹配艺术家名称。


6

您实际上可以定义多个路由...在控制器中定义的操作将首先执行,默认情况在底部。我喜欢将路由定义看作是一个“大型开关语句”,其中满足第一条规则的胜出。

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 = "" }
);               

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接