2012-09-16 39 views
17

tengo este código:POSTAL JSON con MVC 4 Controlador API

$.ajax({ 


     type: "POST", 
     url: "/api/slide", 
     cache: false, 
     contentType: "application/json; charset=utf-8", 
     data: '{"Title":"fghfdhgfdgfd"}', 
     dataType: "json", 

Una Este es mi controladora:

public class SlideController : ApiController 
{ 

    // POST /api/Slide 
    public void Post(string Title) 
    { 
    } 

Cuando ejecuto el código y llamo el/api/diapositivas, el [ Título] no tiene datos y es nulo.

¿Cómo publico JSON en el controlador API?

POST http://127.0.0.2:81/api/slide HTTP/1.1 
Host: 127.0.0.2:81 
Connection: keep-alive 
Content-Length: 18 
Origin: http://127.0.0.2:81 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1 
Content-Type: application/json; charset=UTF-8 
Accept: application/json, text/javascript, */*; q=0.01 
Referer: http://127.0.0.2:81/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

Title=fghfdhgfdgfd 

Respuesta

21

Definir una vista de modelo:

public class SlideViewModel 
{ 
    public string Title { get; set; } 
} 

Después haga que su acción de controlador tomar este punto de vista como modelo argumento:

public class SlideController : ApiController 
{ 
    // POST /api/Slide 
    public void Post(SlideViewModel model) 
    { 
     ... 
    } 
} 

finalmente llamado la acción:

$.ajax({ 
    type: 'POST', 
    url: '/api/slide', 
    cache: false, 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify({ title: "fghfdhgfdgfd" }), 
    success: function() { 
     ...  
    } 
}); 

La razón de esto es que los tipos simples como cadenas están vinculados desde el URI. También lo invito a leer el following article sobre el enlace de modelo en la API web.

+0

No puedo entender cómo sabe qué acción estamos tratando de llamar? En este controlador podemos tener cientos de ellos. – webdeveloper

+2

Es RESTful y convencional. Está utilizando verbo POST en su solicitud de jQuery => se invoca la acción de publicación. Si utilizó el verbo 'GET' (por ejemplo, escribir el nombre de la acción directamente en la barra de direcciones de su navegador) => se habría invocado la acción Obtener. Entonces no puedes tener cientos de ellos. Los verbos HTTP estándar son 'GET',' POST', 'PUT' y' DELETE', por lo que esos son los nombres de las acciones que deberías estar usando. Por supuesto, siempre puede violar las convenciones RESTful estándar => continuar y modificar las rutas en su archivo '~/App_Start/WebApiConfig.cs' para que incluya el nombre de la acción en la url. –

+0

Me pregunto cuál es la diferencia entre los datos: JSON.stringify ({title: "fghfdhgfdgfd"}), y data: '{Title: "fghfdhgfdgfd"}', que terminé usando? – user1615362

2

Prueba esto:

$.ajax({ 
    type: "POST", 
    url: "/api/slide", 
    data: { Title: "fghfdhgfdgfd" } 
}); 

Es las comillas en el atributo de datos que están causando esto:

es decir, los datos >>: {Título: "fghfdhgfdgfd"}
no> > datos: ' {Título: "fghfdhgfdgfd"} '

ACTUALIZACIÓN:
también su controlador parece un poco extraño, aunque es difícil saber sin ver su enrutamiento, etc.

yo esperaría a ver algo de la misma familia:

public class SlideController : ApiController 
{ 
    public HttpResponseMessage PostSlide(string Title) 
    { 
     // Do your insert slide stuff here.... 

     string uri = Url.Link("DefaultApi", new { id = item.Id }); 
     response.Headers.Location = new Uri(uri); 
     return response; 
    } 
} 

Es evidente que usted también necesitará actualizar la URL en su jQuery también.

Echa un vistazo aquí:

http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

Otra actualización:

Sería habitual para crear un objeto de CLR para que coincida con su JSON y utilizar el ligante modelo MVC para unirse directamente a eso. Si no quieres hacer eso se puede enlazar a un objeto y deserializar en un diccionario:

// POST api/values 
public void Post(object json) 
{ 
    Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json.ToString()); 
    var x = values["Title"]; 
} 
+0

el cambio no ayudó, Todavía me sale nulo cuando me rompo en el controlador. – user1615362

+0

Acabo de publicar una actualización de mi respuesta original. –

+0

¿Estás seguro de que estás utilizando MVC 4 API Controller? Estoy usando el andamiaje MVC 4 API Controller predeterminado, con los métodos vacíos. – user1615362

9

Asegúrese de que el objeto al que intenta convertir tiene un constructor predeterminado (vacío).

Regla de oro: si desea deserializar un objeto, debe simplificar la creación de los objetos.Estas pautas pueden ayudar:

  • Todas las propiedades que se van a pasar alrededor debe ser pública

  • el objeto tiene que ser capaz de construida sin ningún parámetro.

Este JSON cadena/objeto por ejemplo:

{ Name: "John Doe", Phone: "123-456-7890", Pets: [ "dog", "cat", "snake" ] } 

se puede convertir a un objeto de la clase siguiente:

public class Person { 

    public string Name { get; set; } 
    public string Phone { get; set; } 
    public string[] Pets { get; set; } 

    } 

o ésta:

public class Person { 

    public string Name { get; set; } 
    public string Phone { get; set; } 
    public string[] Pets { get; set; } 
    public Person() {} 
    public Person(string name, string phone) { 
     Name = name; 
     Phone = phone; 
    } 

} 

o este:

public class Person { 

    public string Name { get; set; } 
    public string Phone { get; set; } 
    public string[] Pets { get; set; } 
    public Person() {} 


} 

pero no esta

public class Person { 

    public string Name { get; set; } 
    public string Phone { get; set; } 
    public string[] Pets { get; set; } 
    public Person(string name, string phone) { 
     Name = name; 
     Phone = phone; 
    } 

} 

Ahora vamos a ASP.NET MVC 4 del resto

public class PersonController : ApiController 
{ 
     // .. other actions 
     public HttpResponseMessage PostPerson(Person person) 
     { 
      if (null != person) 
       // CELEBRATE by doing something with your object 
      else 
       // BE SAD and throw and exception or pass an error message 

     } 
     // .. other actions 
} 

Si su clase no puede tener un constructor por defecto o si no tiene acceso al código fuente de la clase, puede crear una clase de adaptador que

  • tiene un constructor por defecto
  • expone aquellas propiedades que deben ser públicos

Utilización de la clase Persona anterior con ningún constructor por defecto, un adaptador podría parecerse a

public class PersonAdapter { 

    public Person personAdaptee; 

    public string Name { 
     get { return personAdaptee.Name; } 
     set { personAdaptee.Name = value } 
    } 

    public string Phone { 
     get { return personModel.Phone; } 
     set { personModel.Phone = value; } 
    } 

    public string[] Pets { 
     get { return personAdaptee.Pets; } 
     set {personAdaptee.Pets = value } 
    } 

    public PersonAdapter() { 

     personAdaptee = new Person("", "", null); 

    } 

} 

Ahora vamos a ASP.NET MVC 4 hacer el resto

public class PersonController : ApiController 
{ 
     // .. other actions 
     public HttpResponseMessage PostPerson(PersonAdapter person) 
     { 
      if (null != person) 
       // CELEBRATE by doing something with your object 
      else 
       // BE SAD and throw and exception or pass an error message 

     } 
     // .. other actions 
} 
1

moldeada el parámetro de acción a FromBody es decir:

public class SlideController : ApiController 
{ 

    // POST /api/Slide 
    public void Post([FromBody]string Title) 
    { 
    } 
} 
0
$.ajax({ 
    type: 'POST', 
    url: '/api/slide', 
    cache: false, 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify({ title: "fghfdhgfdgfd" }), 
    success: function() { 
     ...  
    } 
}); 

controlador es

public class SlideController : ApiController 
{ 

    // POST /api/Slide 
    public void Post(string Title) 
    { 
    } 

Su URL no es válida, URL debe hacer frente a la acción Mensaje en diapositivas controlador

editar su URL a url: "~/ControllerName/ActionName" en este contexto debe ser Url:"~/Slide/Post"

Cuestiones relacionadas