EDIT : 31/10/2017
Le même code / approche fonctionnera également pour Asp.Net Core 2.0 . La principale différence est que, dans le noyau asp.net, les contrôleurs Web API et les contrôleurs Mvc sont fusionnés en un seul modèle de contrôleur. Ainsi , votre type de retour est peut - être IActionResult
ou l' un de ses mise en œuvre (Ex: OkObjectResult
)
Utilisation
contentType:"application/json"
Vous devez utiliser la JSON.stringify
méthode pour la convertir en chaîne JSON lorsque vous l'envoyez,
Et le classeur de modèle liera les données json à votre objet de classe.
Le code ci-dessous fonctionnera bien (testé)
$(function () {
var customer = {contact_name :"Scott",company_name:"HP"};
$.ajax({
type: "POST",
data :JSON.stringify(customer),
url: "api/Customer",
contentType: "application/json"
});
});
Résultat
contentType
La propriété indique au serveur que nous envoyons les données au format JSON. Puisque nous avons envoyé une structure de données JSON, la liaison du modèle se fera correctement.
Si vous inspectez les en-têtes de la demande ajax, vous pouvez voir que la Content-Type
valeur est définie sur application/json
.
Si vous ne spécifiez pas explicitement contentType, il utilisera le type de contenu par défaut qui est application/x-www-form-urlencoded;
Modifier le novembre 2015 pour résoudre d'autres problèmes possibles soulevés dans les commentaires
Publier un objet complexe
Supposons que vous ayez une classe de modèle de vue complexe comme paramètre de méthode d'action de l'API Web comme celui-ci
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;}
}
et votre point de terminaison de l'API Web est comme
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;
}
}
Au moment d'écrire ces lignes, ASP.NET MVC 6 est la dernière version stable et dans MVC6, les contrôleurs Web api et les contrôleurs MVC héritent de la Microsoft.AspNet.Mvc.Controller
classe de base.
Pour envoyer des données à la méthode du côté client, le code ci-dessous devrait fonctionner correctement
//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 :)
});
La liaison de modèle fonctionne pour certaines propriétés, mais pas pour toutes! Pourquoi ?
Si vous ne décorez pas le paramètre de la méthode API Web avec l' [FromBody]
attribut
[HttpPost]
public CreateUserViewModel Save(CreateUserViewModel m)
{
return m;
}
Et envoyez le modèle (objet javascript brut, pas au format JSON) sans spécifier la valeur de la propriété contentType
$.ajax({
type: "POST",
data: model,
url: "../product/save"
}).done(function (res) {
console.log('res', res);
});
La liaison de modèle fonctionnera pour les propriétés plates du modèle, pas pour les propriétés où le type est complexe / un autre type. Dans notre cas, Id
et les Name
propriétés seront correctement liées au paramètre m
, mais la Tags
propriété sera une liste vide.
Le même problème se produira si vous utilisez la version courte, $.post
qui utilisera le Content-Type par défaut lors de l'envoi de la demande.
$.post("../product/save", model, function (res) {
//res contains the markup returned by the partial view
console.log('res', res);
});
Travailler avec POST dans webapi peut être délicat! Voudrais ajouter à la réponse déjà correcte ..
Se concentrera spécifiquement sur POST, car traiter avec GET est trivial. Je ne pense pas que beaucoup chercheraient à résoudre un problème avec GET avec webapis. Quoi qu'il en soit ..
Si votre question est - Dans MVC Web Api, comment - Utiliser des noms de méthode d'action personnalisés autres que les verbes HTTP génériques? - Effectuer plusieurs publications? - Poster plusieurs types simples? - Poster des types complexes via jQuery?
Ensuite, les solutions suivantes peuvent vous aider:
Tout d'abord, pour utiliser des méthodes d'action personnalisées dans l'API Web, ajoutez un itinéraire API Web en tant que:
Et puis vous pouvez créer des méthodes d'action comme:
Maintenant, lancez le jQuery suivant à partir de la console de votre navigateur
Deuxièmement, pour effectuer plusieurs publications , il est simple, créer plusieurs méthodes d'action et décorer avec l'attribut [HttpPost]. Utilisez le [ActionName ("MyAction")] pour attribuer des noms personnalisés, etc. viendra à jQuery au quatrième point ci-dessous
Troisièmement, tout d'abord, la publication de plusieurs types SIMPLE en une seule action n'est pas possible. De plus, il existe un format spécial pour publier même un seul type simple (à part passer le paramètre dans la chaîne de requête ou le style REST). C'est le point qui m'a fait me cogner la tête avec les clients Rest (comme Fiddler et l'extension cliente Advanced REST de Chrome) et chasser sur le Web pendant près de 5 heures lorsque finalement, l'URL suivante s'est avérée utile. Citera le contenu pertinent pour le lien pourrait devenir mort!
PS: Vous avez remarqué la syntaxe particulière ?
http://forums.asp.net/t/1883467.aspx?The+received+value+is+null+when+I+try+to+Post+to+my+Web+Api
Quoi qu'il en soit, revenons sur cette histoire. Passons à autre chose:
Quatrièmement, la publication de types complexes via jQuery, bien sûr, $ .ajax () va rapidement entrer dans le rôle:
Disons que la méthode d'action accepte un objet Person qui a un identifiant et un nom. Donc, à partir de javascript:
Et l'action ressemblera à:
Tout ce qui précède, a fonctionné pour moi !! À votre santé!
la source
Je viens de jouer avec ça et j'ai découvert un résultat assez étrange. Supposons que vous ayez des propriétés publiques sur votre classe en C # comme ceci:
alors vous devez faire l'astuce JSON.stringify comme suggéré par Shyju et l'appeler comme ceci:
Cependant, si vous définissez des getters et setters sur votre classe comme ceci:
alors vous pouvez l'appeler beaucoup plus simplement:
Cela utilise l'en-tête HTTP:
Je ne suis pas sûr de ce qui se passe ici, mais cela ressemble à un bogue (fonctionnalité?) Dans le cadre. Vraisemblablement, les différentes méthodes de liaison appellent différents «adaptateurs», et bien que l'adaptateur pour application / json fonctionne avec les propriétés publiques, celui pour les données codées par formulaire ne le fait pas.
Je n'ai aucune idée de ce qui serait considéré comme la meilleure pratique.
la source
Utilisez JSON.stringify () pour obtenir la chaîne au format JSON, assurez-vous qu'en passant l'appel AJAX, vous passez les attributs mentionnés ci-dessous:
Ci-dessous est le code donner jquery pour faire un appel ajax post à l'api web asp.net:
la source
Assurez-vous que votre service WebAPI attend un objet fortement typé avec une structure qui correspond au JSON que vous transmettez. Et assurez-vous de stringifier le JSON que vous POSTEZ.
Voici mon JavaScript (en utilisant AngluarJS):
Et voici mon contrôleur WebAPI:
la source
Code suivant pour renvoyer des données au format json, au lieu de xml -Web API 2: -
Mettez la ligne suivante dans le fichier Global.asax
la source
la source
Microsoft en a donné un bon exemple:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-1
Validez d'abord la demande
et que d'utiliser les données sérialisées.
Ici, «Statut» est un champ de type complexe. La sérialisation est effectuée par .NET, pas besoin de s'en inquiéter.
la source
1) Dans votre côté client, vous pouvez envoyer votre demande http.post en chaîne comme ci-dessous
2) Ensuite, dans votre contrôleur Web API, vous pouvez le désérialiser
3) Votre classe ApiReceivedListOfObjects devrait être comme ci-dessous
4) assurez-vous que votre chaîne sérialisée (IndexInfo ici) devient comme la structure ci-dessous avant la commande JsonConvert.DeserializeObject à l'étape 2
la source