我想验证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'custom validation。
答案 0 :(得分:25)
创建从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")]
以上代码尚未编译或测试。
答案 1 :(得分:1)
如何将值传递给API?它是一个查询参数还是在体内?我通常只是在请求处理程序级别进行检查。如果将接受的值放在List或数组中,则可以使用Contains
扩展方法。
if (validStates.Contains(input))
{
return MethodThatProcessesRequest(requiredData);
}
else
{
return ErrorHandlingMethod(requiredData);
}
这种类型的验证应该在服务器端完成。您可以随意限制UI上的输入,但如果您正在制作REST API,则应该验证所有输入,而不管您的客户端正在做什么。
答案 2 :(得分:1)
为Item实现IValidatableObject,这需要你实现Validate方法,然后在Validate中写下你的条件以检查它是否有效,如:
public IEnumerable<ValidationResult> Validate(ValidationContext context) {
if (!States.contains(this.State)){
yield return new ValidationResult("Invalid state.", new[] { "State" });
}
}
答案 3 :(得分:0)
您也可以使用如下正则表达式执行此操作:
[Required]
[RegularExpression("New|Used|Unknown", ErrorMessage = "Invalid State")]
public string State{ get; set; }
更多详情可以通过here
找到