RESTful ASP.NET MVC3路由

时间:2012-03-23 14:36:08

标签: asp.net asp.net-mvc-3 rest routing

我已经查看过已经就这个主题提出的各种问题了,我花了很多时间试图让它按照我的意愿运行,但我没有太多运气,所以希望有人可以帮助我填补空白。

对于我正在创建的新网站,我想尝试让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
}

我错过了什么?而且,我可以更容易地为未来的资源设置这个吗?

4 个答案:

答案 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 }
);