验证 WebAPI 操作的参数
Validation on parameters to a WebAPI action
我有一个 WebAPI 操作,我希望在其中提供一个参数来匹配特定的正则表达式(或其他验证属性,比如 [Range(1, 20)]
)。提供的参数也恰好是 URL.
的一部分
[Route("api/stuff/{id}")]
public HttpResponseMessage Get([RegularExpression(@"^\d+-[a-z]{3}$")] id) {
if (!ModelState.IsValid) {
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
//do stuff
}
不幸的是,模型状态始终有效,即使值与正则表达式不匹配。
我将如何验证此 URL 细分?
应该到那一步吗?试过这个...
[Route("api/stuff/{id:regex(^\d+-[a-z]{3}$)}")]
按照@Pratik 的建议,您可以路由约束是 simplest/easiest 的解决方法。
我做了一个验证属性,如下所示:
[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
public sealed class IPAddressAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
dynamic address = validationContext.ObjectInstance;
long? scope = address.ScopeId;
var isValid = IPAddresses.IsValid(value as string, scope);
var result = ValidationResult.Success;
if (!isValid)
result = new ValidationResult("The provided IP Address is not a valid IPv4 or IPv6 address");
return result;
}
}
然后可以从路由约束中使用它:
public class IPAddressRouteConstraint : IHttpRouteConstraint {
public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection)
{
object value;
if (!values.TryGetValue(parameterName, out value))
return false;
var attr = new IPAddressAttribute();
return attr.IsValid(value);
}
}
这样它在路由和模型验证中共享(取决于我需要逻辑的位置)。
我有一个 WebAPI 操作,我希望在其中提供一个参数来匹配特定的正则表达式(或其他验证属性,比如 [Range(1, 20)]
)。提供的参数也恰好是 URL.
[Route("api/stuff/{id}")]
public HttpResponseMessage Get([RegularExpression(@"^\d+-[a-z]{3}$")] id) {
if (!ModelState.IsValid) {
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
//do stuff
}
不幸的是,模型状态始终有效,即使值与正则表达式不匹配。
我将如何验证此 URL 细分?
应该到那一步吗?试过这个...
[Route("api/stuff/{id:regex(^\d+-[a-z]{3}$)}")]
按照@Pratik 的建议,您可以路由约束是 simplest/easiest 的解决方法。
我做了一个验证属性,如下所示:
[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
public sealed class IPAddressAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
dynamic address = validationContext.ObjectInstance;
long? scope = address.ScopeId;
var isValid = IPAddresses.IsValid(value as string, scope);
var result = ValidationResult.Success;
if (!isValid)
result = new ValidationResult("The provided IP Address is not a valid IPv4 or IPv6 address");
return result;
}
}
然后可以从路由约束中使用它:
public class IPAddressRouteConstraint : IHttpRouteConstraint {
public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection)
{
object value;
if (!values.TryGetValue(parameterName, out value))
return false;
var attr = new IPAddressAttribute();
return attr.IsValid(value);
}
}
这样它在路由和模型验证中共享(取决于我需要逻辑的位置)。