I have Users
控制器和基本 REST 模式工作得很好。不过我需要一种额外的模式users/{id}/usergroups
这将返回该用户的所有用户组。
实现这一点的最佳方法是什么,因为我想我将需要在更多控制器上使用类似的路由。仅使用默认值是不够的...
Error
发现多个与请求匹配的操作:
Api.Models.Users.User GetUser(Int32) 类型 Api.Controllers.UsersController
System.Collections.Generic.IEnumerable`1[Api.Models.Users.UserGroup] GetUserGroups(Int32) 类型 Api.Controllers.UsersController
Code
// GET api/Users
public IEnumerable<User> GetUsers()
// GET api/Users/5
public User GetUser(int id) // THIS IS CONFLICT 1
// PUT api/Users/5
public HttpResponseMessage PutUser(int id, User user)
// POST api/Users
public HttpResponseMessage PostUser(User user)
// DELETE api/Users/5
public HttpResponseMessage DeleteUser(int id)
// GET api/Users/5/UserGroups
public IEnumerable<UserGroup> GetUserGroups(int id) // THIS IS CONFLICT 2
Edit 1
我做了什么amhed建议并不能解决问题。
// GET api/Users/5
[HttpGet, ActionName("getuser")]
public User GetUser(int id) // THIS STILL DOES NOT WORK
// GET api/Users/5/UserGroups
[HttpGet, ActionName("usergroups")]
public IEnumerable<UserGroup> GetUserGroups(int id) // THIS WORKS
// ROUTES
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}/{action}",
defaults: new { id = RouteParameter.Optional, action = RouteParameter.Optional }
);
您可以:只定义一个Get
方法,并有一个可选的 Id 参数,如下所示:
public IEnumerable<User> GetUsers(int? id){
if (id.HasValue)
{
//return collection of one item here
}
//return collection of all items here
}
或者您可以使用 ActionName 属性来装饰多个 Get
// GET api/Users
[ActionName("GetAll")]
public IEnumerable<User> GetUsers()
// GET api/Users/5
[ActionName("Get")]
public User GetUser(int id) // THIS IS NO LONGER IN CONFLICT
然后在 RouteConfig 上定义路由,如下所示:
routes.MapHttpRoute(
name: "DefaultApiWithAction",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)