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