Как обращаться с атрибутами DataAnnotations в ASP.NET Веб-API для строки.Пустые значения?

#c# #asp.net-mvc #json #validation #asp.net-web-api

#c# #asp.net-mvc #json #проверка #asp.net-web-api

Вопрос:

Я борюсь с использованием System.ComponentModel.DataAnnotations атрибутов проверки в ASP.NET Веб-API и ASP.NET MVC со string.Empty null значениями или. Что бы вы порекомендовали, это наилучшая практика для решения этой проблемы при использовании данных JSON?

Рассмотрим следующую модель

     public class SampleModel
    {
        public string Foo { get; set; }
    }
  

Теперь вы можете наблюдать следующее поведение в Web Api и MVC :

     (1) API: { "Foo": null } => Foo == null
    (2) API: { "Foo": "" } => Foo == ""
    (3) MVC: { "Foo": null } => Foo == null
    (4) MVC: { "Foo": "" } => Foo == null
  

Примечание: последнее преобразование (4) связано с ConvertEmptyStringToNull параметром.

Теперь рассмотрим System.ComponentModel.DataAnnotations использование атрибута проверки:

     public class SampleModel
    {
        [RangeAttribute(0, 9)]
        public string Foo { get; set; }
    }
  

ModelState.IsValid Проверка возвращается true во всех 4 случаях, даже если "" она явно не находится в диапазоне [0..9] , потому что все атрибуты проверки проверяют строку.IsNullOrEmpty . Теперь можно было бы утверждать, что null это также string.Empty можно считать необязательным, но особенно в веб-API из-за отсутствия ConvertEmptyStringToNull параметра IMHO это неверно. На мой взгляд, в веб-API необязательный элемент (like Foo ) является необязательным только в том случае, если он отсутствует или имеет null значение. И string.Empty является конкретным значением. Таким образом, мы не можем использовать System.ComponentModel.DataAnnotations атрибуты проверки 1: 1.

Как вы справляетесь с этой проблемой, какова наилучшая практика и каковы намерения ASP.NET команда? Должны ли мы наследовать от всех System.ComponentModel.DataAnnotations атрибутов проверки? Должны ли мы использовать наши собственные атрибуты в веб-API для проверки или мы должны написать собственные ModelMetadataProviders ?

PS: просто для очистки… string.Empty null обработка значений и в привязках моделей для меня в порядке.

Комментарии:

1. Существует логический метод string, который может помочь: String.IsNullOrEmpty(stringValue)

2. В каком случае этот метод мне помогает? Выше я не проверял ничего, кроме атрибутов по умолчанию.