Разные ответы об ошибках Web API ModelState в зависимости от типа данных - PullRequest
0 голосов
/ 09 апреля 2019

Мы используем .NET Web API с SQL Server.Похоже, что ошибки по умолчанию, которые я получаю от API, различаются в зависимости от типа данных столбца.На переднем крае у нас есть таблица, которую заполняют пользователи, которая заполняет вышеупомянутую таблицу базы данных.Если я отправляю запись с пустыми значениями для всех этих обязательных полей, это то, что API возвращает в консоли (на вкладке «Сеть» -> «Ответ»):

{
  "Message": "The request is invalid.",
  "ModelState": {
    "myTable": [
      "Required property 'columnInt1' not found in JSON. Path '', line x, position xxx.",
      "Required property 'columnInt2' not found in JSON. Path '', line x, position xxx.",
      "Required property 'columnInt3' not found in JSON. Path '', line x, position xxx.",
      "Required property 'columnDecimal' not found in JSON. Path '', line x, position xxx."
    ],
    "myTable.columnString1": [
      "The columnString1 field is required."
    ],
            ],
    "myTable.columnString2": [
      "The columnString2 field is required."
    ]
  }
}

Обратите внимание наразличные ответы об ошибках в зависимости от типа данных.Если я изменю один из столбцов varchar на тип данных int или decimal, его ответ об ошибке изменится, чтобы соответствовать сообщению о том, что остальные столбцы типа int / decimal имеют ("Required property 'columnInt1' not found in JSON. Path '', line x, position xxx").

. Я бы предпочел, чтобы все ошибки имелиответ, что два столбца varchar имеют ("The stringColumn1 field is required." и т. д.). Есть ли способ изменить это поведение по умолчанию и почему это так?

Ниже приведен пример дизайна нашей таблицы:

Column Name:       Data Type:           Allow Nulls:
columnInt1              int                   no
columnInt2              int                   no
columnInt3              int                   no
columnDecimal           decimal(5, 2)         no
stringColumn1           varchar(4)            no
stringColumn2           varchar(5)            no

Наша модель API для этой таблицы выглядит следующим образом:

    [Required]
    public int columnInt1 { get; set; }

    [Required]
    public int columnInt2 { get; set; }

    [Required]
    public int columnInt3 { get; set; }

    [Required]
    [Precision(4,2)]
    public decimal columnDecimal { get; set; }

    [Required]
    [StringLength(4)]
    public string columnString1 { get; set; }

    [Required]
    [StringLength(5)]
    public string columnString2 { get; set; }

1 Ответ

0 голосов
/ 10 апреля 2019

Итак, я нашел способ переместить int и десятичные сообщения об ошибках, чтобы они больше походили на строки. АКА, я могу заставить columnInt1 иметь ответ ModelState The columnInt1 field is required.

Для этого требуется объединить необязательный параметр ? с атрибутом `[Required] ', что мне кажется немного неприятным. Может кто-нибудь сказать мне, какие негативные последствия это может вызвать, если таковые имеются? Или просто насколько это плохо? Или - возможно, это не имеет большого значения? Кажется, работает для моих целей.

Вот как выглядит моя модель с исправлением:

[Required]
public int? columnInt1 { get; set; }    // the ? seems contradictory to [Required], but fixes my issue

[Required]
public int? columnInt2 { get; set; }

[Required]
public int? columnInt3 { get; set; }

[Required]
[Precision(4,2)]
public decimal? columnDecimal { get; set; }

[Required]
[StringLength(4)]
public string columnString1 { get; set; }

[Required]
[StringLength(5)]
public string columnString2 { get; set; }
...