Web API自定义validation,以根据已批准值列表检查字符串

我想validationWeb API REST命令的输入。 我希望它可以像下面的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的自定义validation 。

创建从ValidationAttribute派生的自定义validation属性,并覆盖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? 它是一个查询参数还是在体内? 我通常只是在请求处理程序级别进行检查。 如果将接受的值放在List或数组中,则可以使用Contains扩展方法。

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

这种类型的validation应该在服务器端完成。 您可以随意限制UI上的输入,但如果您正在制作REST API,则应该validation所有输入,无论您的客户端在做什么。

为Item实现IValidatableObject,它需要你实现Validate方法,然后在Validate中写你的条件来检查它是否有效,如:

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