我想为我的MVC3应用程序构建一个RESTful Json Api。我需要处理多个Http动词来操作单个对象实例的帮助。
我已经阅读/学习/尝试了以下内容:
MVC属性(HttpGet,HttpPost等)允许我拥有具有相同名称但仍必须具有不同方法签名的多个操作的控制器。
路由约束在MVC启动之前在路由模块中发生,这将导致我有4个明确的路由,并且仍需要单独命名控制器操作。
构建自定义Http动词属性可用于捕获用于访问操作的动词,然后将其作为参数传递给调用操作 - 代码将处理switch案例。此方法的问题是某些方法将需要授权,这应该在操作过滤器级别处理,而不是在操作本身内部处理。 ASP.NET MVC AcceptVerbs and registering routes
我已经阅读/学习/尝试了以下内容:
MVC属性(HttpGet,HttpPost等)允许我拥有具有相同名称但仍必须具有不同方法签名的多个操作的控制器。
路由约束在MVC启动之前在路由模块中发生,这将导致我有4个明确的路由,并且仍需要单独命名控制器操作。
构建自定义Http动词属性可用于捕获用于访问操作的动词,然后将其作为参数传递给调用操作 - 代码将处理switch案例。此方法的问题是某些方法将需要授权,这应该在操作过滤器级别处理,而不是在操作本身内部处理。 ASP.NET MVC AcceptVerbs and registering routes
http://iwantmymvc.com/rest-service-mvc3
需求/目标
One route signature for a single instance object, MVC is expected to handle the four main Http Verbs: GET, POST, PUT, DELETE.
context.MapRoute("Api-SingleItem", "items/{id}", new { controller = "Items", action = "Index", id = UrlParameter.Optional } );
When the URI is not passed an Id parameter, an action must handle
POST
andPUT
.public JsonResult Index(Item item) { return new JsonResult(); }
When an Id parameter is passed to the URI, a single action should handle
GET
andDELETE
.public JsonResult Index(int id) { return new JsonResult(); }
问题
如何让多个动作(具有相同名称和方法签名)分别响应不同的HTTP动词。期望的示例:
[HttpGet]
public JsonResult Index(int id) { /* _repo.GetItem(id); */}
[HttpDelete]
public JsonResult Index(int id) { /* _repo.DeleteItem(id); */ }
[HttpPost]
public JsonResult Index(Item item) { /* _repo.addItem(id); */}
[HttpPut]
public JsonResult Index(Item item) { /* _repo.updateItem(id); */ }
[Authorize]
属性,这将完美地工作。 - Lucero[RestfulAction]
属性为RESTful调用添加了一个静态操作名称,并将方法映射到与此静态操作名称匹配。这不是一个技巧,基本上只是合理地使用MVC可扩展性点。 - Lucero[ActionName("REST")]
,并确保路由将“REST”作为操作名称?这样做可以实现与您所做的相同的效果,但无需引用global.asax中的属性,对吗? - one.beat.consumerglobal.asax
无关,您仍需要自定义路由。该属性(以及特殊的操作名称)有助于防止错误并使代码自文档化。我们甚至已经通过搜索程序集来注册匹配控制器的路由,以便我们可以添加新的控制器而无需手动干预,但这超出了本问题的范围。 - Lucero