Стандартный способ передачи ввода в WebAPI для числовых типов данных?

Может ли кто-нибудь рассказать о передаче ввода для WebApi для числовых типов данных, т.е. int, long и т.д.

public class Emp
{
    public int Id { get; set; }
    public long Volume { get; set; }
}

Входной набор 1:

{
    "Id" : "1",
    "Volume" : "200"
}

это работает без ошибки проверки модели.

Входной набор 2:

{
    "Id" : "1.2",
    "Volume" : "200.5"
}

Ошибка проверки модели, поскольку невозможно преобразовать значения. Ошибка: {"Error converting value \"200.5\" to type 'System.Int64'. Path 'Volume', line 2, position 14."}

Входной набор 3:

{
    "Id" : 1.2,
    "Volume" : 200.5
}

Это не приводит к сбою проверки модели, но значения, сопоставленные с объектом С#, равны Id = 1, Volume = 200.

Но и здесь мне нужна ошибка проверки модели, поскольку я передаю десятичный ввод. Должны быть разрешены только целые числа.

Итак, каков правильный шаблон для отправки ввода API?

Каков правильный способ получить ошибку проверки модели при передаче значений десятичной точки в тип данных int и long.

Using int & long will make those values rounded to nearest integer value

Как переопределить это, чтобы дать ошибки проверки модели?


person Magendran V    schedule 04.09.2018    source источник
comment
Поскольку значение имеет десятичную часть, вы должны использовать тип данных double или decimal для обоих свойств Id и Volume. Использование int и long сделает эти значения округленными до ближайшего целого числа.   -  person Tetsuya Yamamoto    schedule 04.09.2018
comment
Вы пытаетесь отправить десятичные значения, когда ожидается целое число. Вам нужно исправить любой код, вызывающий API, чтобы он не отправлял десятичные дроби, когда ожидаются целые числа. Или измените API, чтобы он принимал десятичные дроби.   -  person Panagiotis Kanavos    schedule 04.09.2018
comment
@TetsuyaYamamoto, использование int & long сделает эти значения округленными до ближайшего целого числа - согласен. Но когда я передаю десятичные значения с двойной кавычкой, это дает ошибку проверки модели. Я хочу, чтобы то же самое происходило при передаче входного набора 3. Поскольку мне нужно разрешать только целые значения, а не десятичные точки\   -  person Magendran V    schedule 04.09.2018
comment
Итак, ваш вопрос заключается именно в том, как взять целое число в качестве параметра и не пройти проверку, если оно на самом деле не является целым числом? (Как вы знаете, строки уже не проходят проверку)   -  person Reinstate Monica Cellio    schedule 04.09.2018
comment
Вы получаете сообщение об ошибке проверки модели, например невозможно преобразовать строку в...? Текущий синтаксический анализатор JSON может автоматически распознавать целочисленное значение, заключенное в кавычки, но не десятичные значения.   -  person Tetsuya Yamamoto    schedule 04.09.2018
comment
Ввод set3 должен выдавать ошибку. Передача чисел в виде чисел, но json допустим, поэтому int можно отправлять как целое число. За исключением десятичных знаков, таких как 12.45, установите свойство модели в десятичные числа и т. д.   -  person Leszek P    schedule 04.09.2018
comment
Обновил вопрос, пожалуйста, проверьте его.   -  person Magendran V    schedule 04.09.2018


Ответы (2)


Вы можете использовать атрибут JsonConverter в свойствах, чтобы определить для него пользовательский преобразователь json.

public class Emp
{
    [JsonConverter(typeof(MyCustomIntConverter))
    public int Id { get; set; }

    public long Volume { get; set; }
}

public class MyCustomIntConverter : JsonConverter<int>
{
    //implement here
}
person stephanV    schedule 04.09.2018

Есть способ заархивировать то, что вы хотите, но это не простой способ.

Ответ @Saif указывает на правильный путь.

Вы должны изменить свою модель, чтобы избежать нежелательного поведения фреймворка и получить необработанные значения, например, изменить тип на double или string.

Затем вы должны проверить аргументы для себя внутри своего метода. Если какой-то аргумент неверен, вы должны создать ошибку проверки модели.

В ядре mvc вы можете создать ошибку проверки модели, подобную этой (в mvc должно быть что-то подобное):

ModelState.AddModelError(nameof(emp.Volume), $"Error converting value {emp.Volume} to long");
person bruno.almeida    schedule 04.09.2018