如果对象为空,如何忽略 FluentValidation 规则
How to Ignore FluentValidation rule if object is null
如何忽略空对象的 FluentValidation 规则。
我有验证器 class 作为
public class RequestModel
{
public int? RecordCount { get; set; } = 100;
}
public class ModelValidator : AbstractValidator<RequestModel>
{
public ModelValidator()
{
When(x => x != null, () =>
{
RuleFor(item => item.RecordCount)
.Cascade(CascadeMode.StopOnFirstFailure)
.Must(x => x == null || (x.Value > 0 && x.Value <= 1000))
.WithMessage($"Invalid Limit. Limit must be between 1 and {1000}. (inclusive) ");
});
}
}
这里我只想验证通过的记录数。
但是当我将 null 对象传递给 api 主体时,它会给出错误
请求错误。请求中有一些无效参数或参数不足。
我不太确定 "api body" 但是如果你想传递一个空对象,你需要重写 ModelValidator
class 中的 Validate
方法.这样你就可以根据你的业务逻辑优雅地传递或失败这样的对象。
这是一个例子:
using FluentValidation;
using FluentValidation.Results;
using System;
using System.Linq;
namespace ConsoleApp13
{
public class RequestModel
{
public int? RecordCount { get; set; } = 100;
}
public class ModelValidator : AbstractValidator<RequestModel>
{
public ModelValidator()
{
When(x => x != null, () =>
{
RuleFor(item => item.RecordCount)
.Cascade(CascadeMode.StopOnFirstFailure)
.Must(x => x == null || (x.Value > 0 && x.Value <= 1000))
.WithMessage($"Invalid Limit. Limit must be between 1 and {1000}. (inclusive) ");
});
}
public override ValidationResult Validate(ValidationContext<RequestModel> context)
{
if (context.InstanceToValidate != null)
{
return base.Validate(context);
}
//if you want to pass
return new ValidationResult();
//if you want to fail
//return new ValidationResult(new[] { new ValidationFailure("Property", "Your Message") });
}
}
class Program
{
static void Main(string[] args)
{
RequestModel rm1 = new RequestModel { RecordCount = null };
RequestModel rm2 = new RequestModel { RecordCount = 100 };
RequestModel rm3 = new RequestModel { RecordCount = -100 };
RequestModel rm4 = null;
ModelValidator v = new ModelValidator();
ValidationResult result1 = v.Validate(rm1);
ValidationResult result2 = v.Validate(rm2);
ValidationResult result3 = v.Validate(rm3);
ValidationResult result4 = v.Validate(rm4);
Console.WriteLine($"IsValid (rm1): {result1.IsValid}\t| {GetError(result1)}");
Console.WriteLine($"IsValid (rm2): {result2.IsValid}\t| {GetError(result2)}");
Console.WriteLine($"IsValid (rm3): {result3.IsValid}\t| {GetError(result3)}");
Console.WriteLine($"IsValid (rm4): {result4.IsValid}\t| {GetError(result4)}");
Console.ReadKey();
}
static string GetError(ValidationResult result)
{
return result.IsValid == false ? string.Join(',', result.Errors.Select(k => k.ErrorMessage).ToArray()) : string.Empty;
}
}
}
结果是这样的:
希望对你有帮助
如何忽略空对象的 FluentValidation 规则。 我有验证器 class 作为
public class RequestModel
{
public int? RecordCount { get; set; } = 100;
}
public class ModelValidator : AbstractValidator<RequestModel>
{
public ModelValidator()
{
When(x => x != null, () =>
{
RuleFor(item => item.RecordCount)
.Cascade(CascadeMode.StopOnFirstFailure)
.Must(x => x == null || (x.Value > 0 && x.Value <= 1000))
.WithMessage($"Invalid Limit. Limit must be between 1 and {1000}. (inclusive) ");
});
}
}
这里我只想验证通过的记录数。 但是当我将 null 对象传递给 api 主体时,它会给出错误
请求错误。请求中有一些无效参数或参数不足。
我不太确定 "api body" 但是如果你想传递一个空对象,你需要重写 ModelValidator
class 中的 Validate
方法.这样你就可以根据你的业务逻辑优雅地传递或失败这样的对象。
这是一个例子:
using FluentValidation;
using FluentValidation.Results;
using System;
using System.Linq;
namespace ConsoleApp13
{
public class RequestModel
{
public int? RecordCount { get; set; } = 100;
}
public class ModelValidator : AbstractValidator<RequestModel>
{
public ModelValidator()
{
When(x => x != null, () =>
{
RuleFor(item => item.RecordCount)
.Cascade(CascadeMode.StopOnFirstFailure)
.Must(x => x == null || (x.Value > 0 && x.Value <= 1000))
.WithMessage($"Invalid Limit. Limit must be between 1 and {1000}. (inclusive) ");
});
}
public override ValidationResult Validate(ValidationContext<RequestModel> context)
{
if (context.InstanceToValidate != null)
{
return base.Validate(context);
}
//if you want to pass
return new ValidationResult();
//if you want to fail
//return new ValidationResult(new[] { new ValidationFailure("Property", "Your Message") });
}
}
class Program
{
static void Main(string[] args)
{
RequestModel rm1 = new RequestModel { RecordCount = null };
RequestModel rm2 = new RequestModel { RecordCount = 100 };
RequestModel rm3 = new RequestModel { RecordCount = -100 };
RequestModel rm4 = null;
ModelValidator v = new ModelValidator();
ValidationResult result1 = v.Validate(rm1);
ValidationResult result2 = v.Validate(rm2);
ValidationResult result3 = v.Validate(rm3);
ValidationResult result4 = v.Validate(rm4);
Console.WriteLine($"IsValid (rm1): {result1.IsValid}\t| {GetError(result1)}");
Console.WriteLine($"IsValid (rm2): {result2.IsValid}\t| {GetError(result2)}");
Console.WriteLine($"IsValid (rm3): {result3.IsValid}\t| {GetError(result3)}");
Console.WriteLine($"IsValid (rm4): {result4.IsValid}\t| {GetError(result4)}");
Console.ReadKey();
}
static string GetError(ValidationResult result)
{
return result.IsValid == false ? string.Join(',', result.Errors.Select(k => k.ErrorMessage).ToArray()) : string.Empty;
}
}
}
结果是这样的:
希望对你有帮助