12

我想验证 Web 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 的自定义验证

4

4 回答 4

29

创建从成员函数派生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")]

上述代码尚未编译或测试。

于 2013-06-21T20:28:59.403 回答
1

值是如何传递给 API 的?它是查询参数还是在正文中?我通常只会在请求处理程序级别进行检查。如果您将接受的值放入列表或数组中,则可以使用Contains扩展方法。

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

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

于 2013-06-21T20:24:59.147 回答
1

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

public IEnumerable<ValidationResult> Validate(ValidationContext context) {
    if (!States.contains(this.State)){
        yield return new ValidationResult("Invalid state.", new[] { "State" });
    }
}
于 2013-06-21T20:31:30.333 回答
0

您也可以使用正则表达式执行此操作,如下所示:

[Required]
[RegularExpression("New|Used|Unknown", ErrorMessage = "Invalid State")]
 public string State{ get; set; }

更多细节可以在这里找到

于 2021-03-16T19:48:33.727 回答