Передача списка KeyValuePair или IDictionary в Web Api Controller из Javascript

У меня есть контроллер веб-api, которому я бы хотел опубликовать два параметра. Один из них - это плоский int ID, а другой - IDictionary или аналогичный эквивалент.

[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'
});

Независимо от того, что я пытаюсь использовать в параметре данных (data: things, data: '=' + things), словарь не доходит до контроллера api. Он либо имеет значение null, либо имеет одну фиктивную запись ({0, 0}).

Я также попытался отправить словарь в Uri - нет.

Как я могу отправить пару слов словаря или ключа в контроллер api?

Ответ 1

Вам не нужен массив - вам нужен простой объект JS (который отображается в словаре). Этот код должен работать:

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'
});

Ответ 2

Это работало для меня:

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

Ответ 3

Это действительно старый, но в JS я создал объект вроде @cesardaniel:

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

но моя форма объекта в .net имела тип Dictionary<KeyValuePair<int, IEnumerable<int>>. Затем веб-ави смог поднять его. Надеюсь, это поможет будущему читателю!

Ответ 4

Словарь

похож на массив пар ключ-значение. вы должны отправить

var data = {}
data['things[0].Key'] = x
data['things[0].Value'] = y
// etc

EDIT:

ваш js должен выглядеть примерно так.

    var data = { };
    data['things[0].Key'] = 1;
    data['things[0].Value'] = 1;
    data['things[1].Key'] = 22;
    data['things[1].Value'] = 12;

    $.ajax({
        url: /api/DoStuff?id=' + id,
        data: data,
        type: 'POST',
        dataType: 'json'
    });

и что-то вроде этого

    public ActionResult DoStuff(int id, Dictionary<int, int> things)
    {
        // ...
    }