我正在使用流畅的验证如下:
public class ProjectValidator : AbstractValidator<Project>
{
public ProjectValidator()
{
RuleFor(project => project.Name).NotEmpty().WithMessage("Project name cannot be empty.");
}
}
Run Code Online (Sandbox Code Playgroud)
在某些服务中:
IValidator<Project> _projectValidator;
_projectValidator.ValidateAndThrow(project);
Run Code Online (Sandbox Code Playgroud)
集成测试的一部分:
var validationException = Assert.Throws<ValidationException>(() => projectRepository.SaveOrUpdate(project));
Assert.That(validationException.Message, Is.EqualTo("Project name cannot be empty."));
Run Code Online (Sandbox Code Playgroud)
这显然不起作用,因为validationException 可能包含许多错误。即使它只包含一个错误,字符串也如下所示:
验证失败:-- 项目名称不能为空。
您将如何检查验证结果/包含指定的验证消息?:
项目名称不能为空。
我未能成功使用Fluent Validations实现不区分大小写的比较。我只是想比较两个电子邮件字段并忽略大小写。
目前的规则是:
RuleFor(x => x.EmailAddress).NotEmpty().Length(5, 200).EmailAddress();
RuleFor(x => x.ConfirmEmailAddress).NotEmpty().Equal(x => x.EmailAddress).WithMessage("Emails must match");
Run Code Online (Sandbox Code Playgroud)
为了添加不区分大小写的要求,我考虑通过 equal 调用传递比较器,但这似乎不起作用。
RuleFor(x => x.ConfirmEmailAddress).NotEmpty().Equal(x => x.EmailAddress, StringComparer.CurrentCultureIgnoreCase).WithMessage("Emails must match");
Run Code Online (Sandbox Code Playgroud)
理想情况下,如果可能的话,我希望在客户端进行不区分大小写的比较。有人能够提供如何实现这一目标的指导吗?
我当前使用的 NuGet 包是:
<package id="FluentValidation" version="5.1.0.0" targetFramework="net45" />
<package id="FluentValidation.MVC4" version="5.1.0.0" targetFramework="net45" />
Run Code Online (Sandbox Code Playgroud) 我有一个场景,我想使用反射来使用 FluentValidation 进行验证。像这样的事情:
public class FooValidator : AbstractValidator<Foo>
{
public FooValidator(Foo obj)
{
// Iterate properties using reflection
var properties = ReflectionHelper.GetShallowPropertiesInfo(obj);
foreach (var prop in properties)
{
// Create rule for each property, based on some data coming from other service...
//RuleFor(o => o.Description).NotEmpty().When(o => // this works fine when foo.Description is null
RuleFor(o => o.GetType().GetProperty(prop.Name)).NotEmpty().When(o =>
{
return true; // do other stuff...
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
调用ReflectionHelper.GetShallowPropertiesInfo(obj)返回对象的“浅层”属性。然后,我为每个属性创建一条规则。这是我获取对象属性的代码:
public static class ReflectionHelper
{
public static IEnumerable<PropertyInfo> …Run Code Online (Sandbox Code Playgroud) 我试图找出在 FluentValidation 中是否有可用的方法,它允许在根级别为验证器验证集合。
例如,如下所示,一个验证器可CustomerValidator用于一个类Customer。使用 FluentValidation;
public class CustomerValidator: AbstractValidator<Customer> {
public CustomerValidator() {
RuleFor(customer => customer.Surname).NotEmpty();
RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
RuleFor(customer => customer.Address).Length(20, 250);
RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
}
private bool BeAValidPostcode(string postcode) {
// custom postcode validating logic goes here
}
}
Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);
bool validationSucceeded = results.IsValid;
IList<ValidationFailure> failures = results.Errors; …Run Code Online (Sandbox Code Playgroud) 我有一个复杂属性的类:
public class A
{
public B Prop { get; set; }
}
public class B
{
public int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我添加了一个验证器:
public class AValidator : AbstractValidator<A>
{
public AValidator()
{
RuleFor(x => x.A.Id).NotEmpty().WithMessage("Please ensure you have selected the A object");
}
}
Run Code Online (Sandbox Code Playgroud)
但在A.Id的客户端验证期间,我仍然有一个默认的val消息:"'Id'不能为空".如何从验证器将其更改为我的字符串?
如果流畅的验证方法失败,我想运行一个方法。
RuleFor(x => x.SheepName)
.Must(x => x.SheepName == null)
.When(x => x.HasSheep == false)
.Otherwise(callMethod());
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,如果 HasSheep 值为 false 但仍然给出了 SheepName,那么我想运行一个方法(在示例中该方法称为“callMethod()”)。
我已经编写了 .Otherwise 语句,因此寻找整行 '.Otherwise(callMethod());' 的内容 需要是..
基于此页面,我正在尝试制作一个使用流畅验证的剃刀页面。它似乎已经检查过,但我不确定为什么错误消息不会显示。
这是我到目前为止所做的:
cshtml.cs:
CreateCommandValidator CreateValidator = new CreateCommandValidator();
var createCheck = CreateValidator.Validate(NewItem);
foreach (ValidationFailure fail in createCheck.Errors)
{
ModelState.AddModelError(fail.PropertyName, fail.ErrorMessage);
}
return Page();
Run Code Online (Sandbox Code Playgroud)
.cshtml:
<label class="col-form-label">Name</label>
<input asp-for="NewItem.Name" type="text" class="form-control mb-2"/>
<span asp-validation-for="NewItem.Name" class="text-danger"></span>
Run Code Online (Sandbox Code Playgroud)
创建命令验证器:
RuleFor
(Item => Item.Name)
.NotEmpty().WithMessage("The name cannot be empty")
.Length(1, 100);
Run Code Online (Sandbox Code Playgroud)
ValidationFailure 能够检测到错误消息,但不确定为什么它不会显示在页面上。有什么想法吗?提前致谢!
error-handling fluentvalidation razor asp.net-core razor-pages
我用来FluentValidation验证我的输入ASP.NET Core 3.1 Web API。我用“自动”方式来做。所以在我的Startup课堂上我有这个:
services.AddControllers()
.AddFluentValidation(opt =>
{
opt.RegisterValidatorsFromAssemblyContaining(typeof(UserInputValidator));
});
Run Code Online (Sandbox Code Playgroud)
这样,FluentValidation就可以神奇地验证上述程序集的所有输入,而无需其他代码。非常甜蜜,但是......响应格式与我返回时使用的响应格式不同BadRequest。这是 FluentValidation 格式:
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "|3b037c98-40d28ab8553d6989.",
"errors": {
"UserId": [
"'User Id' must be greater than '0'."
],
"Score": [
"'Score' must be between 0 and 500. You entered 900."
]
}
}
Run Code Online (Sandbox Code Playgroud)
我宁愿有:
{
"code": 123456,
"message": "One or more validation errors occurred.",
"errors": [
"'User Id' …Run Code Online (Sandbox Code Playgroud) c# fluentvalidation .net-core asp.net-core asp.net-core-webapi
我尝试使用 FluentValidation 进行验证,object.GetType()而不是通过注入在编译时了解类型IValidator<T>,但我得到的是null值而不是有效的验证器。
组织+验证者
namespace ConsoleApp44
{
internal class Organisation
{
public string? Name { get; set; }
}
internal class OrganisationValidator: AbstractValidator<Organisation>
{
public OrganisationValidator()
{
RuleFor(x => x.Name).NotEmpty();
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用它的控制台应用程序
var services = new ServiceCollection();
services.AddValidatorsFromAssemblyContaining<OrganisationValidator>();
services.Add(ServiceDescriptor.Scoped(typeof(IValidatorFactory), typeof(ServiceProviderValidatorFactory)));
var sp = services.BuildServiceProvider();
var org = new Organisation();
var validationFactory = sp.GetRequiredService<IValidatorFactory>(); // Not null
var validator = validationFactory.GetValidator(org.GetType()); // Null
validator = validationFactory.GetValidator<Organisation>(); // Null
validator = sp.GetRequiredService<IValidator<Organisation>>(); // Exception, …Run Code Online (Sandbox Code Playgroud) 我正在使用FluentValidation 2来验证某些实体.我想创建一个IValidationService我可以传递到其他服务,以允许他们执行验证.我想像这样揭露它:
public interface IValidationEngine
{
IEnumerable<ValidationError> Validate<T>(T entity);
}
Run Code Online (Sandbox Code Playgroud)
哪个ValidationError类封装了我的验证错误.理想情况下,我不想在我的某个服务(例如OrderValidator)中公开特定的验证器.我希望验证服务能够构建/找到正确的验证器.FV是否内置了用于查找特定类型的验证器(以及内部缓存)的内容?或者,我是否必须走这IValidatorFactory条路线,然后将每个验证器连接到我的IoC容器?
fluentvalidation ×10
c# ×8
validation ×4
.net ×3
asp.net ×2
asp.net-core ×2
.net-core ×1
nunit ×1
razor ×1
razor-pages ×1
reflection ×1
unit-testing ×1