2015-02-10 7 views
1

У меня есть действие WebAPI, в котором я ожидаю, что аргумент будет предоставлен для соответствия определенному регулярному выражению (или другому атрибуту проверки, например [Range(1, 20)]). Предоставляемый параметр также является частью URL-адреса.Проверка параметров для действия WebAPI

[Route("api/stuff/{id}")] 
public HttpResponseMessage Get([RegularExpression(@"^\d+-[a-z]{3}$")] id) { 
    if (!ModelState.IsValid) { 
     return Request.CreateResponse(HttpStatusCode.BadRequest); 
    } 

    //do stuff 
} 

К сожалению, состояние модели всегда действительное, даже если значение не соответствует регулярному выражению.

Как бы я проверил этот URL-сегмент?

+0

Можете ли вы использовать ограничения маршрута для ограничения параметра http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 – softveda

ответ

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

Должно ли это так далеко? Пытался это ...

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

Уточнил мой вопрос. Я использовал 'RegularExpressionAttribute', поскольку он был самым простым, но это может быть любой атрибут проверки (диапазон, тип данных, что-то обычное) –

Смежные вопросы