2012-10-06 24 views
12

Estoy tratando de POSTAR datos JSON a un método Web Api pero los datos JSON no son vinculantes para el modelo.ASP.Net Web Api no vinculante modelo en POST

Aquí es mi modelo:

[DataContract] 
public class RegisterDataModel 
{ 
    [DataMember(IsRequired = true)] 
    public String SiteKey { get; set; } 

    [DataMember(IsRequired = true)] 
    public String UserId { get; set; } 

    [DataMember(IsRequired = true)] 
    public String UserName { get; set; } 
} 

Aquí está mi acción Api Web:

public class RegisterController : ApiController 
    { 
    public Guid Post([ModelBinder] RegisterDataModel registerDataModel) 
    { 
     if (!ModelState.IsValid) 
     { 
      throw new ModelStateApiException(ModelState); 
     } 
     var userProfileDataContract = userProfileBusinessLibrary.GetNewOne(); 
     userProfileDataContract.UserId = registerDataModel.UserId; 
     userProfileDataContract.UserName = registerDataModel.UserName; 

     var userKey = userProfileBusinessLibrary.Register(registerDataModel.SiteKey, userProfileDataContract); 

     return userKey; 
    } 
    } 

Antes añadí [ModelBinder], registerDataModel era nula. Después de agregar [ModelBinder], registerDataModel es una instancia de RegisterDataModel, pero todos los valores de las propiedades son nulos.

Aquí está mi solicitud a través de Fiddler:

http://local.testwebsite.com/api/register 

Request Headers: 
User-Agent: Fiddler 
Host: local.testwebsite.com 
Content-Length: 89 
Content-Type: application/json; charset=utf-8: 

Request Body: 
{ 
"SiteKey":"qwerty", 
"UserId": "12345qwerty", 
"UserName":"john q" 
}  

¿Qué me falta para que mi unen los datos posteriores a las propiedades RegisterDataModel? Gracias por tu ayuda.

+0

Es posible que solo necesite el atributo '[Publicar]' en la acción de su controlador. – McGarnagle

+1

Gracias por responder, pero agregar [HttpPost] no ayudó. Entiendo con WebApi que no necesita los atributos del verbo http porque ASP.net MVC usa una convención de emparejar el verbo con la acción del controlador. –

Respuesta

10

¿Cómo está creando la solicitud JSON? ¿A través del creador de solicitudes de Fiddler? Pruebe solo lo siguiente en el cuerpo de la solicitud.

{ 
"SiteKey":"qwerty", 
"UserId": "12345qwerty", 
"UserName":"john q" 
} 

Supongo que 'Request Body:' también es parte de su cuerpo de solicitud. Eliminar eso y comprobar.

+0

Estoy usando el compositor de Fiddler para enviar los datos json a mi API web. Aquí hay una captura de pantalla: http://screencast.com/t/x2IH6hp01rGQ –

+0

Si elimino [ModelBinder], me funciona perfectamente. Copié el código pegado y lo probé. Una diferencia que veo aquí es que su contenido-Length es 89. El mío es 64 para la misma carga exacta. Es por eso que supongo que está enviando algo extra como 'Cuerpo de la solicitud': – Badri

+4

Ah, por cierto, hay un punto o dos puntos adicionales al lado de utf-8 Tipo de contenido: application/json; charset = utf-8: Quítelo e intente por favor – Badri

11

No se relaciona con el problema de la OP, pero el título de la pregunta me llevó aquí cuando he usado (públicos) campos en lugar de propiedades en la clase de modelo (es decir, sin {get; set;}). Resultó que esto también hace que el enlace falle.

Quizás ayude a alguien.

+1

Tuve exactamente el mismo problema y agregué un get y lo resolví. –

+1

Esto me ayudó también. Me alegra ver que no fue eliminado, definitivamente pertenece con este título de pregunta, incluso si OP ya tenía propiedades. –

+0

Esto me ayudó. ¡Muchas gracias! – pwaivers

0

En mi caso, las solicitudes de la aplicación se pasan a través de un middleware llamado "API Manager" para autenticación/autorización antes de reenviar a mi .NET Web API. El parámetro POST no está enlazado porque, por alguna razón no tengo idea de por qué, el "Content-Length" se emite desde los encabezados. La razón es porque el valor predeterminado JsonMediaTypeFormatter siempre comprueba las solicitudes 'Content-Length' antes de realizar el enlace del modelo. y si no se presenta Content-Length, establecerá el parámetro en NULL.

Cuestiones relacionadas