2012-06-22 28 views
5

estoy consiguiendo lo que considero que es una cuestión de unión extraño en el ASP.NET MVC 4 API Web RC. Tengo un método destinado a aceptar solicitudes de correos del cliente. El problema es que ninguno de los parámetros es vinculante cuando se llama al método de publicación, llego a mi punto de interrupción en la línea de lanzamiento y el nombre, ambos son nulos. Si cambio el tipo de solicitud a GET en JavaScript, se llama a la función Get a continuación con los parámetros vinculados.ASP.NET MVC 4 RC Web API Parámetro Número Encuadernación

Por qué son los parámetros en su defecto que se uniera durante el método POST, y cómo puedo solucionar este problema?

send: function(evt) { 
    evt.preventDefault(); 
    $.ajax({ 
     url: '/api/person', 
     data: this.model.toJSON(), 
     type: "POST", 
     dataType: "json", 
     success: function(data) { 
      console.log("Success"); 
     }, 
     error: function(data) { 
      console.log("Error"); 
     } 
    }); 
    } 

El siguiente es las acciones del controlador:

public void Get(string name, string email) { 
    throw new NotImplementedException(); 
} 

public void Post(string name, string email) { 
    throw new NotImplementedException(); 
} 

Notas:

  • estoy usando todos los valores predeterminados para ASP.NET MVC 4 API Web RC (para que el deserializer debe ser Json.NET)
  • la ficha red Chrome en el depurador JS muestra los parámetros en los datos del formulario en el poste correctamente.

Respuesta

13

A diferencia de MVC (páginas web), parámetros simples tipos will not, by default, bind from the post body but instead from the URI. Por lo tanto, con su código como está, tendría que pasar los parámetros name y email en la cadena de consulta o como parámetros de ruta.

Sin embargo, esto puede ser resuelto fácilmente mediante la creación de un tipo de modelo (en MVC vernácula) y usando que para los parámetros del método. De hecho, a continuación, se puede utilizar para ambos (en el caso de que usted ha dado), si a continuación, utiliza [FromUri] en el método get:

public class SomeParams { 
    public string name { get; set; } 
    public string email { get; set; } 
} 

//now an alternative way to write the Get method 
public MyResult Get([FromUri] SomeParams p){ 
    //members are bound from the query string (more like MVC traditional binding) 
    //note - as in MVC, SomeParams will need a default constructor for this to work. 
} 

public PostResult Post(SomeParams p){ 
    //'p' is bound from your JSON (assuming correct format) 
    //because 'complex' types are deserialized using formatters 
    //only one object can be read from the body with a formatter in Web API 
    //as the request body is not buffered; unlike MVC. 
} 

me he pegado en los tipos de retorno de los métodos porque sí ¡Tendrían que devolver algo!

Realmente recomiendo leer el artículo de Mike Stall al que me enlace arriba (y muchos de sus otros).

Es tentador asumir que la API Web, ya que comparte los mismos paradigmas e incluso los nombres de las clases de MVC, es en realidad el mismo que MVC - pero no lo es. Inicialmente me pregunté por qué era este el caso (ya que he escrito muchos servicios REST además de MVC y me pareció genial, una vez que haya escrito algunas clases de utilidad y mejoras de clase base), pero han examinado adecuadamente los desafíos de escribir una API web y creo que probablemente tengan razón al haber realizado los cambios de enfoque que tienen.

Sin embargo, sí significa que tenemos que tomar algunas cosas que ahora puede dar por hechas y volver a aprender de ellos para la API de Web.

+0

Mi parámetro get no es nulo, de hecho ni siquiera existe. Puede que no haya sido claro, pero solo está ahí para ilustrar que la funcionalidad funciona en GET y no en POST. – Cody

+1

Bien - bien, está bien entonces :). En resumen, si vincula varios parámetros del cuerpo de la solicitud, básicamente, lo más fácil es escribir un tipo de modelo simple como lo he mostrado. –

+0

Gracias por el enlace del artículo de Mike Stall, fue muy informativo sobre lo que está sucediendo. Acabo de suponer que Web API utilizó exactamente la misma estrategia vinculante que MVC. Crear una clase personalizada para recibir los params funcionó a las mil maravillas, no soy fan de esa solución pero no entiendo por qué, así que probablemente solo sea terco. :) En cualquier caso, es la solución que usaré. ¡Gracias!:) – Cody

Cuestiones relacionadas