验证Web API操作的参数

时间:2015-02-10 06:37:53

标签: asp.net-web-api

我有一个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
}

不幸的是,模型状态始终有效,即使该值与正则表达式不匹配。

如何验证此网址段?

2 个答案:

答案 0 :(得分:1)

根据@Pratik的建议,您可以路由约束是最简单/最简单的方法。

我做了一个Validation属性:

[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);
    }
}

这样它在路径和模型验证中共享(取决于我需要逻辑的地方)。

答案 1 :(得分:-1)

它应该走得那么远吗?试过这个...

[Route("api/stuff/{id:regex(^\d+-[a-z]{3}$)}")]