使用 FluentValidation 检查字符串是否是大于零的数字

问题描述 投票:0回答:3

我开始在 WPF 项目上使用

FluentValidation
,到目前为止,我以一种简单的方式使用它来检查字段是否已填充或少于 n 个字符。

现在我必须检查插入的值(这是一个字符串...该死的旧代码)是否大于 0。有没有一种简单的方法可以使用

进行转换
RuleFor(x=>x.MyStringField).Somehow().GreaterThen(0) ?

提前致谢

c# fluentvalidation
3个回答
11
投票

只需编写一个像这样的自定义验证器

public class Validator : AbstractValidator<Test>
    {
        public Validator()
        {
            RuleFor(x => x.MyString)
                .Custom((x, context) =>
                {
                    if ((!(int.TryParse(x, out int value)) || value < 0))
                    {
                        context.AddFailure($"{x} is not a valid number or less than 0");
                    }
                });
        }
    }

从您需要验证的地方执行此操作

var validator = new Validator();
var result = validator.Validate(test);
Console.WriteLine(result.IsValid ? $"Entered value is a number and is > 0" : "Fail");

更新 11/8/21

如果您要在大型项目或 API 上使用此功能,则最好从

Startup
执行此操作,我们不需要在每个方法中手动调用
validator.Validate()

services.AddMvc(options => options.EnableEndpointRouting = false)
                .AddFluentValidation(fv =>
                {
    fv.RegisterValidatorsFromAssemblyContaining<BaseValidator>();
                    fv.ImplicitlyValidateChildProperties = true;
                    fv.ValidatorOptions.CascadeMode = CascadeMode.Stop;
                })

11
投票

另一种解决方案:

RuleFor(a => a.MyStringField).Must(x => int.TryParse(x, out var val) && val > 0)
.WithMessage("Invalid Number.");

0
投票

您可以使用转换https://docs.fluidation.net/en/latest/transform.html

Transform(from: x => x.SomeStringProperty, to: value => int.TryParse(value, out int val) ? (int?) val : null)
.GreaterThan(0);
© www.soinside.com 2019 - 2024. All rights reserved.