微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net-core – 是否可以在ASP.NET Core中使用自定义ModelState验证提供程序?

我有以下ASP.NET CORE操作:

public async Task<IActionResult> Post([FromBody]Model model) { 

   IValidator<Model> validator = new Validator<Model>();

   Boolean valid = await validator.ValidateAsync(model); 

   if (!valid)
      return HttpBadRequest(validator.GetErrors());

   // Do something
}

我没有在我的操作中定义验证器,而是如何将其与IOC和自定义ModelState验证提供程序集成?

解决方法

首先,您需要实现自定义 IModelValidatorProviderIModelValidator

请考虑我写的这个简单的例子.

public class MyCustomModelValidatorProvider : IModelValidatorProvider
{
    public void GetValidators(ModelValidatorProviderContext context)
    {
        if (context.ModelMetadata.MetadataKind == ModelMetadataKind.Type)
        {
            var validatorType = (typeof(MyCustomModelValidator<>).MakeGenericType(context.ModelMetadata.ModelType));
            var validator = Activator.CreateInstance(validatorType);

            context.Validators.Add((IModelValidator)validator);
        }
    }
}


public interface ISelfValidatableModel
{
    string Validate();
}

public class MyCustomModelValidator<T> : IModelValidator where T : ISelfValidatableModel
{
    public bool Isrequired
    {
        get { return false; }
    }

    public IEnumerable<ModelValidationResult> Validate(ModelValidationContext context)
    {
        var model = (T)context.Model;

        var error = model.Validate();

        if (!string.IsNullOrEmpty(error))
        {
            return new List<ModelValidationResult>()
            {
                new ModelValidationResult(model.ToString(),error)
            };
        }

        return Enumerable.Empty<ModelValidationResult>();
    }
}

您需要将自定义提供程序添加到MVC选项中

services.AddMvc(options =>
{
    options.ModelValidatorProviders.Add(new MyCustomModelValidatorProvider());
});

框架内置示例:

DataAnnotationsModelValidatorProvider.cs

DataAnnotationsModelValidator.cs

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐