EDITAR : 31/10/2017
El mismo código / enfoque funcionará también para Asp.Net Core 2.0 . La principal diferencia es que, en asp.net core, tanto los controladores de API web como los controladores de Mvc se fusionan en un solo modelo de controlador. Por lo que su tipo de retorno podría ser IActionResult
o uno de ellos de aplicación (Ej: OkObjectResult
)
Utilizar
contentType:"application/json"
Debe usar el JSON.stringify
método para convertirlo a una cadena JSON cuando lo envíe,
Y la carpeta modelo enlazará los datos json a su objeto de clase.
El siguiente código funcionará bien (probado)
$(function () {
var customer = {contact_name :"Scott",company_name:"HP"};
$.ajax({
type: "POST",
data :JSON.stringify(customer),
url: "api/Customer",
contentType: "application/json"
});
});
Resultado
contentType
La propiedad le dice al servidor que estamos enviando los datos en formato JSON. Como enviamos una estructura de datos JSON, el enlace del modelo se realizará correctamente.
Si inspecciona los encabezados de la solicitud ajax, puede ver que el Content-Type
valor se establece como application/json
.
Si no especifica contentType explícitamente, utilizará el tipo de contenido predeterminado que es application/x-www-form-urlencoded;
Edite en noviembre de 2015 para abordar otros posibles problemas planteados en los comentarios
Publicar un objeto complejo
Supongamos que tiene una clase de modelo de vista compleja como su parámetro de método de acción de API web como este
public class CreateUserViewModel
{
public int Id {set;get;}
public string Name {set;get;}
public List<TagViewModel> Tags {set;get;}
}
public class TagViewModel
{
public int Id {set;get;}
public string Code {set;get;}
}
y su punto final de la API web es como
public class ProductController : Controller
{
[HttpPost]
public CreateUserViewModel Save([FromBody] CreateUserViewModel m)
{
// I am just returning the posted model as it is.
// You may do other stuff and return different response.
// Ex : missileService.LaunchMissile(m);
return m;
}
}
Al momento de escribir esto, ASP.NET MVC 6 es la última versión estable y en MVC6, tanto los controladores de API web como los controladores MVC heredan de la Microsoft.AspNet.Mvc.Controller
clase base.
Para enviar datos al método desde el lado del cliente, el siguiente código debería funcionar bien
//Build an object which matches the structure of our view model class
var model = {
Name: "Shyju",
Id: 123,
Tags: [{ Id: 12, Code: "C" }, { Id: 33, Code: "Swift" }]
};
$.ajax({
type: "POST",
data: JSON.stringify(model),
url: "../product/save",
contentType: "application/json"
}).done(function(res) {
console.log('res', res);
// Do something with the result :)
});
El enlace de modelo funciona para algunas propiedades, ¡pero no para todas! Por qué ?
Si no decora el parámetro del método API web con el [FromBody]
atributo
[HttpPost]
public CreateUserViewModel Save(CreateUserViewModel m)
{
return m;
}
Y envíe el modelo (objeto javascript sin procesar, no en formato JSON) sin especificar el valor de la propiedad contentType
$.ajax({
type: "POST",
data: model,
url: "../product/save"
}).done(function (res) {
console.log('res', res);
});
El enlace del modelo funcionará para las propiedades planas del modelo, no para las propiedades donde el tipo es complejo / otro tipo. En nuestro caso, Id
y las Name
propiedades se vincularán correctamente al parámetro m
, pero la Tags
propiedad será una lista vacía.
El mismo problema ocurrirá si está utilizando la versión corta, $.post
que utilizará el Tipo de contenido predeterminado al enviar la solicitud.
$.post("../product/save", model, function (res) {
//res contains the markup returned by the partial view
console.log('res', res);
});
¡Trabajar con POST en webapi puede ser complicado! Me gustaría agregar a la respuesta ya correcta.
Se centrará específicamente en POST ya que tratar con GET es trivial. No creo que muchos estarían buscando para resolver un problema con GET con webapis. De todos modos ..
Si su pregunta es: en MVC Web Api, ¿cómo: - Usar nombres de métodos de acción personalizados distintos de los verbos HTTP genéricos? - Realizar múltiples publicaciones? - Publicar múltiples tipos simples? - Publicar tipos complejos a través de jQuery?
Entonces las siguientes soluciones pueden ayudar:
Primero, para usar métodos de acción personalizados en la API web, agregue una ruta de API web como:
Y luego puede crear métodos de acción como:
Ahora, dispara el siguiente jQuery desde la consola de tu navegador
En segundo lugar, para realizar múltiples publicaciones , es simple, crear múltiples métodos de acción y decorar con el atributo [HttpPost]. Use el [ActionName ("MyAction")] para asignar nombres personalizados, etc. Vendrá a jQuery en el cuarto punto a continuación
En tercer lugar, en primer lugar, no es posible publicar múltiples tipos SIMPLES en una sola acción. Además, hay un formato especial para publicar incluso un solo tipo simple (además de pasar el parámetro en la cadena de consulta o estilo REST). Este fue el punto que me hizo golpearme la cabeza con Rest Clients (como Fiddler y la extensión avanzada de cliente REST de Chrome) y buscar en la web durante casi 5 horas cuando, finalmente, la siguiente URL demostró ser de ayuda. ¡Citará el contenido relevante para el enlace que podría volverse muerto!
PD: ¿Notó la sintaxis peculiar ?
http://forums.asp.net/t/1883467.aspx?The+received+value+is+null+when+I+try+to+Post+to+my+Web+Api
De todos modos, vamos a superar esa historia. Hacia adelante:
En cuarto lugar, publicar tipos complejos a través de jQuery, por supuesto, $ .ajax () pronto entrará en el rol:
Digamos que el método de acción acepta un objeto Persona que tiene una identificación y un nombre. Entonces, desde javascript:
Y la acción se verá así:
¡Todo lo anterior, funcionó para mí! ¡Salud!
fuente
Acabo de jugar con esto y descubrí un resultado bastante extraño. Digamos que tiene propiedades públicas en su clase en C # como esta:
entonces debes hacer el truco JSON.stringify como lo sugiere Shyju y llamarlo así:
Sin embargo, si define getters y setters en su clase de esta manera:
entonces puedes llamarlo mucho más simple:
Esto usa el encabezado HTTP:
No estoy muy seguro de lo que está sucediendo aquí, pero parece un error (¿característica?) En el marco. Presumiblemente, los diferentes métodos de enlace están llamando a diferentes "adaptadores", y si bien el adaptador para la aplicación / json funciona con propiedades públicas, el de los datos codificados en forma no.
Sin embargo, no tengo idea de cuál sería considerada la mejor práctica.
fuente
Use JSON.stringify () para obtener la cadena en formato JSON, asegúrese de que al realizar la llamada AJAX pase los atributos mencionados a continuación:
A continuación se muestra el código de Give JQuery para hacer una llamada ajax a la API web de asp.net:
fuente
Asegúrese de que su servicio WebAPI espera un objeto fuertemente tipado con una estructura que coincida con el JSON que está pasando. Y asegúrese de stringificar el JSON que está PUBLICANDO.
Aquí está mi JavaScript (usando AngluarJS):
Y aquí está mi controlador WebAPI:
fuente
Siguiente código para devolver datos en formato json, en lugar de xml -Web API 2: -
Ponga la siguiente línea en el archivo Global.asax
fuente
fuente
Microsoft dio un buen ejemplo de hacer esto:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-1
Primero validar la solicitud
y que usar los datos serializados.
Aquí 'Estado' es un campo en el tipo complejo. La serialización es realizada por .NET, no hay que preocuparse por eso.
fuente
1) En el lado del cliente, puede enviarle una solicitud http.post en cadena como a continuación
2) Luego, en su controlador de API web, puede deserializarlo
3) Su clase ApiReceivedListOfObjects debería ser como a continuación
4) asegúrese de que su cadena serializada (IndexInfo aquí) se convierta en la siguiente estructura antes del comando JsonConvert.DeserializeObject en el paso 2
fuente