在 ASP.NET Core 中,当使用自定义的 IModelValidatorProvider,将无法获取模型验证错误。为了解决此问题,需要在自定义 IModelValidatorProvider 实现中调用 IModelValidator 的实现。
下面是一个示例:
public class CustomModelValidatorProvider : IModelValidatorProvider
{
private readonly IServiceProvider _serviceProvider;
public CustomModelValidatorProvider(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public void CreateValidators(ModelValidatorProviderContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
var validators = new List();
foreach (var attribute in context.ModelMetadata.ValidatorMetadata.OfType())
{
var validator = _serviceProvider.GetService();
validators.Add(validator);
}
context.Validators.AddRange(validators);
}
}
public class MyCustomValidator : IModelValidator
{
public IEnumerable Validate(ModelValidationContext validationContext)
{
var model = validationContext.Model;
var name = validationContext.ModelMetadata.Name;
var valueAsString = model == null ? null : Convert.ToString(model, CultureInfo.CurrentCulture);
if (string.IsNullOrWhiteSpace(valueAsString))
{
yield return new ModelValidationResult(name, "The value can not be null or empty.");
}
}
}
在此示例中,我们使用了自定义的 IModelValidatorProvider 和 IModelValidator 实现。在实现过程中,我们需要创建一个自定义 IModelValidatorProvider 实例,并在其中调用自定义的 IModelValidator 实现。
如上所述,在自定义 IModelValidatorProvider 实现中,我们可以创建自定义属性的 IModelValidator 实例,并将其添加到 context.Validators 中。接下来,在自定义 IModelValidator 实现中,我们可以实现模型验证逻辑。例如,我们可以检查值是否为 null 或空,并在不满足时返回 ModelValidationResult。