Intereting Posts

Специальная проверка веб-API для проверки строки по списку утвержденных значений

Я хотел бы подтвердить ввод данных в команде REST Web API. Я хотел бы, чтобы он работал над чем-то вроде State ниже, украшенным атрибутом, который ограничивает допустимые значения параметра.

 public class Item { ... // I want State to only be one of "New", "Used", or "Unknown" [Required] [ValidValues({"New", "Used", "Unknown"})] public string State { get; set; } [Required] public string Description { get; set; } ... } 

Есть ли способ сделать это, не обойдя зерно Web API. В идеале подход будет похож на обычную проверку Ruby on Rails.

Создайте собственный атрибут проверки, полученный из ValidationAttribute и переопределите функцию члена IsValid .

 public class ValidValuesAttribute: ValidationAttribute { string[] _args; public ValidValuesAttribute(params string[] args) { _args = args; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (_args.Contains((string)value)) return ValidationResult.Success; return new ValidationResult("Invalid value."); } } 

Тогда вы можете сделать

 [ValidValues("New", "Used", "Unknown")] 

Вышеприведенный код не был скомпилирован или протестирован.

Как передается значение API? Это параметр запроса или он находится в теле? Обычно я просто делал чек на уровне обработчика запросов. Если вы поместите принятые значения в список или массив, вы можете просто использовать метод Contains .

  if (validStates.Contains(input)) { return MethodThatProcessesRequest(requiredData); } else { return ErrorHandlingMethod(requiredData); } 

Этот тип проверки должен выполняться на стороне сервера. Не стесняйтесь ограничивать ввод в пользовательском интерфейсе, но если вы создаете REST API, он должен проверять все входные данные независимо от того, что делает ваш клиент.

Внесите IValidatableObject для элемента, который потребует от вас выполнить метод Validate, а затем в Validate напишите свое условие, чтобы проверить, действительно ли это:

 public IEnumerable Validate(ValidationContext context) { if (!States.contains(this.State)){ yield return new ValidationResult("Invalid state.", new[] { "State" }); } }