2012-08-08 14 views
13

Dado el ASP.NET Web API de rutas:Web enlace de modelos API

example/{Id} 

que asigna a la siguiente método de acción ApiController:

public void Example(Model m) 
{ 
    ... 
} 

Con la clase de modelo definido como:

public class Model 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Cuando publico JSON { "Name": "Testing" } en la URL /example/123, entonces Id propiedad del Model objeto no está vinculado. Permanece como 0 en lugar de 123.

¿Cómo puedo hacer que el enlace del modelo también incluya valores de los datos de la ruta? Preferiría no tener que escribir carpetas de modelo personalizado para lo que parece un caso de uso común. Cualquier idea sería muy apreciada. ¡Gracias!

Respuesta

3

El proceso sugerido para esto normalmente es publicar en /example en lugar de /example/{id}. (Aunque con la API Web que utilizan normalmente /api/{controller})

Mira la tabla a mitad de camino abajo en esta página: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

También puedes ver este enlace en "Inserción de un disco con la API Web ASP.NET" - http://stephenwalther.com/archive/2012/03/05/introduction-to-the-asp-net-web-api.aspx

+0

¿Qué pasa si estoy PONIENDO un recurso? En ese caso, no quiero eliminar la ID de la URL. –

+2

En ese caso, debe tenerlo como un parámetro separado en su acción '(int id, modelo, modelo)' No es la mejor solución que conozco. – dkarzon

0

No creo que el cuaderno por defecto pueda asociar el valor de su ruta de Id a su propiedad de Id del modelo, así que cualquier respuesta d1k_is es tan buena como me temo; ya sea eso o escribiendo su propia carpeta (¿podría escribir una carpeta más genérica?) si tiene una súper clase DomainEntity o algo así ...)

10

La manera más fácil de lograr lo que está buscando es simplemente agregar otro parámetro a su método, y especificar qué parámetro proviene de qué parte de la solicitud.

Ejemplo:

[HttpPost] 
public void Example([FromUri]int id, [FromBody]Model m) { 
    // ... 
} 

Ahora su ruta de /examples/{id} habrá éxito será capaz de unirse - porque el método Example tiene un parámetro llamado id la que está buscando en el URI. Para rellenar el modelo, puede pasar el ID de allí también, o hacer algo como lo siguiente:

[HttpPost] 
public void Example([FromUri]int id, [FromBody]Model m) { 
    m.Id = id; // Make sure the model gets the ID as well. 
} 

Después, simplemente Publicar en { "Name": "Testing" }-/example/123 como usted ha mencionado anteriormente.