Массив кортежей в JSON (TypeScript) не распознается точкой входа API - PullRequest
0 голосов
/ 31 мая 2019

У меня есть угловое приложение, которое вызывает мой бэкэнд, написанное на Asp.net c #.Серверная часть работает корректно (уже используется мобильным приложением), но одна точка входа не работает правильно, когда на нее воздействует угловое приложение.

Я сериализую массив массивов и отправляю его в API, нопри попадании в точку входа API создается впечатление, что данные массива кортежей не принимаются.

Я уже посмотрел свой массив кортежей, данные правильно сериализованы на стороне клиента json, но не полученына стороне сервера.

Вот определение точки входа в моем c # API:

 public HttpResponseMessage Xamarin_UpdateStatut([FromRoute] int idEvent,          [System.Web.Http.FromBody] List<Tuple<int, bool>> listUsersStatut)
    {
    }

А вот на стороне клиента отправлено кортеж (получить через консоль Chrome): "[[2102, false], [1096, false], [73, false]] "

Вот код, используемый для сериализации массива кортежей в Json (на стороне клиента):

 var listUpdate = new Array<[number, boolean]>();
arr.forEach(re => {
  let el: [number, boolean] = [re.userId, re.wasThere];
  listUpdate.push(el);
});
let body = JSON.stringify(listUpdate);

Я несколько раз отлаживал на стороне сервера, длина списка была равна 0. Я пытался изменить тип, полученный от List, на массив Tuple (на стороне сервера, в определении метода), но он ничего не изменил.

Itмне кажется, что выход JSON является коррт. д., поэтому я не понимаю, почему это не работает.

Небольшая помощь будет принята с благодарностью:)

Хорошего дня и заранее спасибо,

Лио

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

Кортежи в C # обрабатываются как классы, тогда как вы настраиваете свою модель на стороне клиента, как если бы они были массивами.Попробуйте что-то вроде этого:

 var listUpdate = new Array<{item1: number, item2: boolean}>();
arr.forEach(re => {
  let el: {item1: number, item2: boolean} = {item1: re.userId, item2: re.wasThere};
  listUpdate.push(el);
});

Я бы лично предложил использовать строго типизированный класс вместо кортежей, чтобы у вас было более значимое имя свойства, чем Item1 и Item2.

Вы можете также рассмотреть возможность публикации объекта со списком в качестве одного из его свойств, а не публикацию самого списка: это даст вам возможность добавлять больше данных к объекту в будущем, если возникнет такая необходимость., без необходимости изменять столько кода.

0 голосов
/ 31 мая 2019

Привязка происходит по имени. Начиная с Модель Binding : «MVC попытается привязать данные запроса к параметрам действия по имени. MVC будет искать значения для каждого параметра, используя имя параметра и имена его общедоступных настраиваемых свойств.»

Чтобы привязка была успешной, имена в вашем JSON должны совпадать с именами параметров C #, включая имена свойств каждого параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...