11 votes

Envoyer un tableau de chaînes à la méthode API web

voici mon appel ajax côté client :

    var list = ["a", "b", "c", "d"];

    var jsonText = { data: list };

    $.ajax({
        type: "POST",
        url: "/api/scheduledItemPriceStatus/updateStatusToDelete",
        data: jsonText,
        dataType: "json",
        traditional: true,
        success: function() { alert("ça a fonctionné!"); },
        failure: function() { alert("ça ne fonctionne pas..."); }
    });

voici l'en-tête réseau de Chrome :

Adresse URL de la demande : http://localhost:2538/api/scheduledItemPriceStatus/updateStatusToDelete

Méthode de la demande : POST

En-têtes de requête voir la source

Accepter: application/json, text/javascript, */*; q=0.01

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

Accept-Encoding: gzip,deflate,sdch

Langue acceptée : en-US,en;q=0.8

Connexion: keep-alive

Longueur du contenu : 27

Type de contenu: application/x-www-form-urlencoded; charset=UTF-8

Hôte: localhost:2538

Origine: http://localhost:2538

Référent : http://localhost:2538/Pricing/ScheduledItemPrices

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11

X-Requested-With: XMLHttpRequest

Données du formulaire encodées en URL

data: a
data: b
data: c
data: d

voici ma méthode de contrôleur WebAPI :

public HttpResponseMessage UpdateStatusToDelete(string[] data)

résultat :

quand je débogue, le paramètre data dans UpdateStatusToDelete renvoie {string[0]} au lieu de data: a data: b data: c data: d

Qu'est-ce que je fais mal ? Toute aide est vraiment appréciée.

34voto

Mark Berryman Points 849

Pour passer simplement des types, les données à poster doivent prendre la forme d'une paire de noms et de valeurs avec la portion du nom étant une chaîne vide. Vous devez donc faire l'appel Ajax de cette façon :

$.ajax({
  type: "POST",
  url: "/api/values",
  data: { "": list },
  dataType: "json",
  success: function() { alert("ça a fonctionné!"); },
  failure: function() { alert("ça ne fonctionne pas..."); }
});

De plus, sur votre action Web API, annotez-la avec l'attribut [FromBody]. Quelque chose comme :

public void Post([FromBody]string[] values)

Cela devrait fonctionner.

4voto

Shaulian Points 59

Vous devez passer la liste elle-même et non un autre objet l'enveloppant.

Par exemple, passez ce qui suit :

var list = ["a", "b", "c", "d"];

dans

$.ajax({
        type: "POST",
        url: "/api/scheduledItemPriceStatus/updateStatusToDelete",
        // Passez la liste elle-même
        data: list, 
        dataType: "json",
        traditional: true,
        success: function() { alert("ça a fonctionné!"); },
        failure: function() { alert("ça ne fonctionne pas..."); }
    });

Votre signature de méthode côté serveur est correcte.

2voto

Cris Points 2561

Utilisez var jsonText = { données: JSON.stringify(list)}

1voto

Stelian Matei Points 10753

Dans le backend, vous pourriez utiliser FormDataCollection.GetValues(string key) pour renvoyer un tableau de chaînes de caractères pour ce paramètre.

public HttpResponseMessage UpdateStatusToDelete(FormDataCollection formData) {
    string[] data = formData.GetValues("data");
    ...
}

0voto

Gaurav Shah Points 316

Utilisez la méthode ci-dessus pour envoyer un tableau comme suggéré par Cris dans votre appel jQuery AJAX. Les données JSON sont généralement sous forme de clé-valeur.

  var tmp = [];
  tmp.push({
  //C'est le nom de la clé 'a'  "a": "votre valeur", //cela pourrait être n'importe quoi ici en
   //format de chaîne.
    "b": "b",
    "c": "c",
    "d": "d"
   });

 { data: JSON.stringify(tmp);} 

Vous pouvez également réaliser ce qui précède en utilisant un tableau bidimensionnel

De plus, faites ceci dans le projet webapi.

sous le dossier modèles de votre projet web API, créez un fichier de classe. Possiblement class1.cs.

Créez 4 propriétés

public string a {get; set;}
public string b {get; set;}
public string c {get; set;}
public string d {get; set;}

Maintenant, faites ceci dans votre contrôleur

utilisant projectname.models

[HttpPost]
public type-de-retour nom-action(List obj)
{
  //Logique supplémentaire à ajouter ici
} 

Je suis sûr que cela fonctionnera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X