我已经查看过已经就这个主题提出的各种问题了,我花了很多时间试图让它按照我的意愿运行,但我没有太多运气,所以希望有人可以帮助我填补空白。
对于我正在创建的新网站,我想尝试让URL结构更加RESTful(我想用我的第一个MVC3创建,但是,时间不允许这样的实验)。但是,我不希望所有不同的URL都指向同一个操作。我希望为每个请求的资源采取不同的操作,以使控制器代码简洁直观。
以下是我正在拍摄的网址结构示例:
/Case //This currently works
/Case/123 //This currently works
/Case/123/Comment //This one does not work (404)
以下是我目前设置路线的方式:
routes.MapRoute(
"Case",
"Case/{id}",
new { controller = "Case", action = "Number" }
);
routes.MapRoute(
"CaseComment",
"Case/{caseId}/Comment/{id}",
new { controller = "Case", action = "CaseComment" }
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
我列出的前两个URL与此路由结构一起正常工作。第一个URL将我带到我的列表页面。指定id后,我点击Number
操作,以便显示该特定记录的详细信息。 Comment
网址无效。
我对第三个URL的操作定义为:
public ActionResult CaseComment(string caseId, string id) {
//Narr
}
我错过了什么?而且,我可以更容易地为未来的资源设置这个吗?
答案 0 :(得分:1)
我相信MapRoutes是有序的,所以
/Case/123/Comment
正在使用您的
routes.MapRoute(
"Case",
"Case/{id}",
new { controller = "Case", action = "Number" });
路线,因此抛出404.最具体的路线应该放在更一般的路线之上。
答案 1 :(得分:0)
尝试将CaseComment路线放在Case路线上方。
答案 2 :(得分:0)
映射路由是特定于订单的。
你可能希望考虑在MVC中进行静态路由的一件事是一个名为RestfulRouting的项目,它位于GitHub上,最初是由Steve Hodgekiss编写的。
https://github.com/stevehodgkiss/restful-routing
如果不出意外,查看代码可能对您有所帮助。
希望这有帮助。
答案 3 :(得分:0)
我需要将id参数设为可选。
routes.MapRoute(
"Case Resources",
"Case/{caseId}/{action}/{id}",
new { controller = "Case", action = "CaseComment", id = UrlParameter.Optional }
);