Свободная проверка для одного параметра Webapi - PullRequest
0 голосов
/ 29 октября 2018

Я использую webapi2 и Fluent для проверки запроса. У меня есть метод ниже.

public IHttpActionResult Post(string id)
{}

Я хочу добавить проверку к идентификатору, такую ​​как проверка регулярного выражения и проверка длины. Есть ли способ, где я могу использовать пользовательский атрибут валидатора, имеющий такой же синтаксис, как [FromQuery]?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Я создал пользовательский атрибут привязки параметра для проверки.

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);
        }
    }
0 голосов
/ 30 октября 2018

Если вы говорите, что заинтересованы в проверке регулярных выражений и длины, самым чистым способом было бы добавить шаблон регулярных выражений к атрибуту Route или HttpPost/HttpGet.

, например

[HttpPost("{id:regex(^[[a-z0-9]]{{26}}$)}", Name = "PostDummy")]
public IActionResult Post(string id)
{
    return Created("uri", id);
}
...