【问题标题】:Fluent Validation for Webapi Single parameterWebapi 单参数的流利验证
【发布时间】:2018-10-29 16:57:55
【问题描述】:

我正在使用 webapi2 和 Fluent 验证来验证请求。我有以下方法。

public IHttpActionResult Post(string id)
{}

我想为 id 添加验证,例如正则表达式验证和长度验证。有什么方法可以使用与[FromQuery] 相同语法的自定义验证器属性?

【问题讨论】:

    标签: c# asp.net-web-api asp.net-web-api2 fluentvalidation


    【解决方案1】:

    我创建了一个自定义参数绑定属性来进行验证。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 2011-10-12
      • 2019-07-13
      相关资源
      最近更新 更多