Веб-API — как сделать параметры типа значения в сложном объекте обязательными

Мне интересно, как лучше всего использовать параметры типа значения (DateTime, int и т. д.), необходимые для веб-API.

Согласно this, я должен сделать свойство обнуляемым и использовать атрибут Required. Это приводит к той же проблеме, описанной здесь. Следуя совету в этом вопросе SO и используя [DataMember(IsRequired=true)], похоже, работает, но сообщения об ошибках, возвращаемые в ModelState, не так полезны, как использование атрибута Required. Кроме того, мне нужно иметь дело с типом, допускающим значение NULL, в контроллере, который, как мы знаем, никогда не будет нулевым, поскольку он проходит проверку модели.

Я видел, как люди описывали это как ошибку, а также видел, что это может быть решено в Web API 2. Есть ли в этом правда?


person Rob    schedule 30.10.2014    source источник
comment
Вы смотрели на FluentValidation, у него есть проверка NotEmpty, которая считает значение типов значений по умолчанию недопустимым. Его можно использовать отдельно или есть расширение, которое подключает его к проверке веб-API.   -  person Ben Robinson    schedule 30.10.2014
comment
Я еще не сделал, но я буду сейчас. Моя первоначальная забота, не пытаясь сначала попробовать код, заключается в том, что произойдет, если вы действительно хотите передать ноль для int. NotEmpty потерпит неудачу, потому что по умолчанию для int используется ноль?   -  person Rob    schedule 30.10.2014
comment
Однако вы никогда не сможете обойти это; как ASP.NET должен знать, когда вы имеете в виду 0 и когда вы имеете в виду пустой? Вот почему существует подход с нулевым значением: чтобы устранить двусмысленность.   -  person Jeroen Vannevel    schedule 30.10.2014
comment
Справедливо. Итак, предполагая подход с нулевым значением, нужно ли мне делать DataMember IsRequired? Использование только обязательного атрибута не работает. Затем, как я уже упоминал, ошибка, которую вы получаете при использовании DataMember IsRequired, довольно уродлива.   -  person Rob    schedule 30.10.2014