He Users controlador básica y patrón de DESCANSO está trabajando muy bien. Sin embargo necesito un patrón users/{id}/usergroups que devolverá todos los grupos de usuario para el usuario.

Cuál sería la mejor forma de implementar esta ya que me imagino que tendrá las rutas similares en muchos más controladores. Solo por defecto no son suficientes…

Error

Múltiples acciones fueron encontrados que coinciden con la solicitud:
La Api.Modelos.Los usuarios.Usuario GetUser(Int32) en el tipo de Api.Los controladores.UsersController
Sistema.Las colecciones.Genérica.IEnumerable`1[Api.Modelos.Los usuarios.Grupo de usuarios] GetUserGroups(Int32) en el tipo de Api.Los controladores.UsersController

Código

//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

Editar 1

Hice lo que amhed sugerido y no resuelve el problema.

//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 }
);
  • Puedo ver su Solicitud HTTP? ¿qué es el error? la ruta no se encuentra?
InformationsquelleAutor sed | 2013-07-07

2 Comentarios

  1. 19

    Usted puede: basta con definir una Get método, y tienen una opción de Parámetro Id como este:

    public IEnumerable<User> GetUsers(int? id){
        if (id.HasValue)
        {
             //return collection of one item here
        }
        //return collection of all items here
    }

    O puede tener varios estará decorada con el ActionName Atributo

    //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

    Y, a continuación, definir las rutas en su RouteConfig así:

    routes.MapHttpRoute(
                name: "DefaultApiWithAction",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
                );
    • Solo para aclararapi/Users y api/Users/5 no están en conflicto. api/Users/5 y api/Users/5/UserGroups son.
    • A continuación, utilice el ActionName enfoque 🙂
  2. 1

    Estoy atascado utilizando la API de Web v1 y vino para arriba con la siguiente solución a esto. Para todos de sus vías generales, declarar la ActionName como «Default». A continuación, en la ruta de configuración, configurar la acción predeterminada=»Default». Esto cambia su llamada a /Usuarios/5 para los usuarios/5/default y asegura que se asigna al lugar correcto. El único problema que he encontrado w/esta solución es que la documentación que se va a mostrar el /Default parte de la ruta. Parece que usted puede editar su vista para excluir estos como este hombre hizo (https://stackoverflow.com/a/29353198/4374666).

    Si usted está usando v2, parece como Atributo de Enrutamiento sería la forma más limpia.

    //GET api/Users/5
    [HttpGet, ActionName("Default")]
    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 = "Default" }
    );

Dejar respuesta

Please enter your comment!
Please enter your name here