FluentValidation - 如何在运行时自定义验证消息
FluentValidation - How to customize the validation message in runtime
在此实体中:
public class Foo
{
public Guid Id { get; set; }
public string Type { get; set; }
public string Name { get; set; }
}
如何使用另一个 属性 实体或从数据库中获取的任何其他字符串在运行时自定义验证消息?
RuleFor(foo => foo.Name)
的验证消息为:
var msg = "The foo with type '" + foo.Type + "' already exists in the database with name '" + nameInDataBase + "'!"
创建几个自定义验证器,并将它们定义为扩展方法,以便您可以链接它们。将验证所需的内容传递到模型中。然后如果你有foo.Type作为你的模型的属性,你可以在消息中显示它,如下所示:
RuleFor(foo => foo.Name).FooTypeIsInvalidValidator().WithMessage("The foo with type: {0} is invalid!", foo => foo.Type);
或
RuleFor(foo => foo.Name).FooAlreadyExistsValidator().WithMessage("The foo with type: {0} already exists in the database with name", foo => foo.Type);
由于我遇到了一个复杂的场景,在这里找到了解决我问题的解决方案:Custom Validators。
验证器代码如下:
public class FooValidator : AbstractValidator<Foo>
{
public FooValidator()
{
Custom(foo =>
{
var repo = new Repository<Foo>();
var otherFooFromDB = repo.GetByName(foo.Name);
if (!otherFooFromDB.Equals(foo))
{
return new ValidationFailure("Id", "The foo with ID'" + otherFooFromDB.Id + "' has the same name of this new item '" + foo.Id + " - " + foo.Name + "'.!");
}
else
{
return null;
}
});
}
}
使用此解决方案,当验证正常时只需 return null
。
但是当出现验证错误时 return 一个 ValidationFailure
的实例,并在她的构造函数中传递经过验证的 属性 的名称和验证消息。
在此实体中:
public class Foo
{
public Guid Id { get; set; }
public string Type { get; set; }
public string Name { get; set; }
}
如何使用另一个 属性 实体或从数据库中获取的任何其他字符串在运行时自定义验证消息?
RuleFor(foo => foo.Name)
的验证消息为:
var msg = "The foo with type '" + foo.Type + "' already exists in the database with name '" + nameInDataBase + "'!"
创建几个自定义验证器,并将它们定义为扩展方法,以便您可以链接它们。将验证所需的内容传递到模型中。然后如果你有foo.Type作为你的模型的属性,你可以在消息中显示它,如下所示:
RuleFor(foo => foo.Name).FooTypeIsInvalidValidator().WithMessage("The foo with type: {0} is invalid!", foo => foo.Type);
或
RuleFor(foo => foo.Name).FooAlreadyExistsValidator().WithMessage("The foo with type: {0} already exists in the database with name", foo => foo.Type);
由于我遇到了一个复杂的场景,在这里找到了解决我问题的解决方案:Custom Validators。
验证器代码如下:
public class FooValidator : AbstractValidator<Foo>
{
public FooValidator()
{
Custom(foo =>
{
var repo = new Repository<Foo>();
var otherFooFromDB = repo.GetByName(foo.Name);
if (!otherFooFromDB.Equals(foo))
{
return new ValidationFailure("Id", "The foo with ID'" + otherFooFromDB.Id + "' has the same name of this new item '" + foo.Id + " - " + foo.Name + "'.!");
}
else
{
return null;
}
});
}
}
使用此解决方案,当验证正常时只需 return null
。
但是当出现验证错误时 return 一个 ValidationFailure
的实例,并在她的构造函数中传递经过验证的 属性 的名称和验证消息。