我们有一个处理艺术家和场地的网站,我们正在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,所以我们可以路由到该动作),但我不确定这是否可取,更不用说可能了。

由于

有帮助吗?

解决方案

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

其他提示

您实际上会定义多个路线...控制器中定义的操作将首先显示,默认位于底部。我喜欢将路由定义视为“大'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 = "" }
);               
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top