web-dev-qa-db-fra.com

Passer la liste de KeyValuePair ou IDictionary à Web Api Controller à partir de Javascript

J'ai un contrôleur d'api Web sur lequel je voudrais poster deux paramètres. L'un est un ID plat et l'autre est un IDictionary ou un équivalent similaire.

[HttpPost]
public void DoStuff(int id, [FromBody]IDictionary<int, int> things)
{
}

var things = new Array();
things.Push({ 1: 10 }); // tried things.Push({ Key: 1, Value: 10 })
things.Push({ 2: 11 });
$.ajax({
    url: '/api/DoStuff?id=' + id,
    data: '=' + JSON.stringify(things), // tried what seems like 100 different things here
    type: 'POST',
    dataType: 'json'
});

Peu importe ce que j'essaie dans le paramètre data (data: things, data: '=' + things), le dictionnaire ne parvient pas au contrôleur api. Il est nul ou comporte une entrée fictive ({0, 0}).

J'ai également essayé d'envoyer le dictionnaire dans l'Uri - non, allez-y.

Comment puis-je envoyer le dictionnaire ou la paire de valeurs de clé au contrôleur d'api?

12
user1810582

Vous n'avez pas besoin d'un tableau, vous avez besoin d'un simple objet JS (qui correspond à un dictionnaire). Ce code devrait fonctionner:

var things = {};
things['1'] = 10;
things['2'] = 11;
$.ajax({
    url: '/api/DoStuff?id=' + id,
    data: JSON.stringify(things),
    contentType: 'application/json'
    type: 'POST',
    dataType: 'json'
});
18
carlosfigueira

Celui-ci a fonctionné pour moi:

var settings = [];
settings.Push({ key: "setting01", value: "Value01" });
settings.Push({ key: "setting02", value: "Value02" });
3
Cesar Daniel

C'est vraiment vieux, mais dans JS j'ai créé un objet comme @cesardaniel:

var dictionary = [];
dictionary.Push({ key: 1, value: [1,2,3,4,5] });
dictionary.Push({ key: 2, value: [6,7,8,9,0] });

mais ma forme d'objet dans .net était de type Dictionary<KeyValuePair<int, IEnumerable<int>>. L'API Web a ensuite été en mesure de le détecter. J'espère que cela aidera un futur lecteur!

0
cloudstrifebro