4

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

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

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

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

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

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

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

谢谢

4

2 回答 2

8

MapRoute 的第四个参数允许您指定值的限制。您可以在此路由之前添加一条用于“艺术家/{action}/{id}”的路由,并限制操作的有效值;未能匹配您的一项操作,它将落入下一条与艺术家姓名匹配的路线。

于 2009-04-30T18:37:06.147 回答
6

You would actually define multiple routes... the defined actions in your controller would go first with the default being at the bottom. I like to think of route definitions as a "big 'ole switch statement" where first rule satisfied wins..

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 = "" }
);               
于 2009-04-30T22:56:56.240 回答