Свободная проверка для одного параметра Webapi
Я использую webapi2 и свободную проверку для подтверждения запроса. У меня есть метод ниже.
public IHttpActionResult Post(string id)
{}
Я хочу добавить проверку идентификатору, такую как проверка регулярного выражения и проверка длины. Есть ли способ, где я могу использовать пользовательский атрибут валидатора, имеющий такой же синтаксис, как [FromQuery]
?
2 ответа
Я создал пользовательский атрибут привязки параметров для проверки.
public class ValidateItemAttribute : ParameterBindingAttribute
{
public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter) => new ItemIdValidation(parameter);
}
public class ItemIdValidation : HttpParameterBinding, IValueProviderParameterBinding
{
public HttpParameterBinding DefaultUriBinding;
public IEnumerable<ValueProviderFactory> ValueProviderFactories { get; }
public ItemIdValidation(HttpParameterDescriptor desc) : base(desc)
{
var defaultUrl = new FromUriAttribute();
this.DefaultUriBinding = defaultUrl.GetBinding(desc);
this.ValueProviderFactories = defaultUrl.GetValueProviderFactories(desc.Configuration);
}
public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
{
return DefaultUriBinding.ExecuteBindingAsync(metadataProvider, actionContext, cancellationToken).ContinueWith((tsk) =>
{
var currentBoundValue = this.GetValue(actionContext)?.ToString();
var isMatched = currentBoundValue != null ? Regex.IsMatch(currentBoundValue, "^[0-9]*$") : false;
if (null != currentBoundValue && (!isMatched || currentBoundValue?.Length != 6))
{
var result = new
{
ErrorCode ="1",
ErrorDescription = "Invalid item id"
};
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, result, "application/json");
}
}, cancellationToken);
}
}
Учитывая, что вы говорите, что заинтересованы в проверке регулярных выражений и длины, самым чистым способом было бы добавить шаблон регулярных выражений в Route
или же HttpPost/HttpGet
приписывать.
например
[HttpPost("{id:regex(^[[a-z0-9]]{{26}}$)}", Name = "PostDummy")]
public IActionResult Post(string id)
{
return Created("uri", id);
}