fluentvalidation 相关问题

Fluent Validation是一个ASP.NET MVC集成验证框架,允许开发人员使用表达式设置验证规则。它是可测试的并且与控制(依赖注入)模式和TDD(测试驱动开发)技术的反转完全兼容。

VB.Net 使用 FluenValidation 库验证类属性

大家好我正在尝试在 VB.Net 中使用 FluentValidation 来验证简单类的属性 这是类: Public Sub New(ByVal descrizione As String,metristoppino As Integer,assortim ...

回答 0 投票 0

无法加载类型“FluentValidation.Attributes.ValidatorAttribute”

System.TypeLoadException:'无法从程序集'FluentValidation,Version = 9.0.0.0,Culture = neutral,PublicKeyToken = 7de548da2fbae0f0'加载类型'FluentValidation.Attributes.ValidatorAttribute'。'...

回答 1 投票 0

实体框架流畅的多对多配置

我有这些表: 物品 编号(PK) 类别A B类 C类 类别 类别(PK) 类别类型 (PK) 市场(PK) 姓名 在 Item 表上,我想要 3 个导航属性: CategoriesA:使用 Categ...

回答 1 投票 0

带有 SetAsyncValidator 的 FluentValidator

公共类 SubmitCarValidator : AbstractValidator { 私有只读 ICarRepository _carRepository; 公共提交汽车验证器(ICarRepository carRepository) { _carRepository = carRepository;

回答 1 投票 0

流畅的验证自定义响应模型

我正在使用 Fluent Validation 来管理 asp.net 7 中的验证,它配置如下或跨所有端点自动管理。 builder.Services.AddFluentValidationAutoValidation(); 建立...

回答 1 投票 0

Blazor Wasm 和带有本地化的 FluentValidation

在我的剃须刀档案中 在我的剃须刀文件夹里 <EditForm id="@EditFromId" Model="@Entity" OnValidSubmit="Save"> <FluentValidator TValidator="PersonalInformationValidator" /> 在我的 PersonalInformationValidator 类中 public PersonalInformationValidator(IStringLocalizer<ErrorResource> Loc) { ClassLevelCascadeMode = CascadeMode.Continue; RuleFor(entity => entity.FatherName).NotEmpty().WithMessage(x=>Loc["Father-Name-Required"]) .Length(3, 50).WithMessage(x => Loc["Father-Name-Length"]); } 我得到编译时错误 错误 CS1662 无法将 lambda 表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型 和 错误 CS0310“PersonalInformationValidator”必须是具有公共无参数构造函数的非抽象类型,以便将其用作泛型类型或方法“FluentValidator”中的参数“TValidator” 试图将此行添加到 Program.cs builder.Services.AddTransient<IValidator<PersonalInformation>, PersonalInformationValidator>(); 还尝试创建一个无参数的contractor PersonalInformationValidator,它解决了Validator does not work的编译时错误。 我正在使用 FluentValidation (11.4.0) 和客户端站点中的此类 public class FluentValidator<TValidator> : ComponentBase where TValidator : IValidator, new() { private readonly static char[] separators = new[] { '.', '[' }; private TValidator? validator; [CascadingParameter] private EditContext? EditContext { get; set; } protected override void OnInitialized() { if (EditContext != null) { validator = new TValidator(); var messages = new ValidationMessageStore(EditContext); EditContext.OnFieldChanged += (sender, eventArgs) => ValidateModel((EditContext?)sender, messages); EditContext.OnValidationRequested += (sender, eventArgs) => ValidateModel((EditContext?)sender, messages); } } private void ValidateModel(EditContext? editContext, ValidationMessageStore messages) { if (editContext != null) { var context = new ValidationContext<object>(editContext.Model); var validationResult = validator?.Validate(context); messages.Clear(); if (validationResult != null) { foreach (var error in validationResult.Errors) { var fieldIdentifier = ToFieldIdentifier(editContext, error.PropertyName); messages.Add(fieldIdentifier, error.ErrorMessage); } editContext.NotifyValidationStateChanged(); } } } private static FieldIdentifier ToFieldIdentifier(EditContext editContext, string propertyPath) { var obj = editContext.Model; while (true) { var nextTokenEnd = propertyPath.IndexOfAny(separators); if (nextTokenEnd < 0) { return new FieldIdentifier(obj, propertyPath); } var nextToken = propertyPath.Substring(0, nextTokenEnd); propertyPath = propertyPath.Substring(nextTokenEnd + 1); object newObj; if (nextToken.EndsWith("]")) { nextToken = nextToken.Substring(0, nextToken.Length - 1); var prop = obj.GetType().GetProperty("Item"); var indexerType = prop?.GetIndexParameters()[0].ParameterType; var indexerValue = Convert.ChangeType(nextToken, indexerType); newObj = prop?.GetValue(obj, new object[] { indexerValue }); } else { var prop = obj.GetType().GetProperty(nextToken); if (prop == null) { throw new InvalidOperationException($"Could not find property named {nextToken} on object of type {obj.GetType().FullName}."); } newObj = prop?.GetValue(obj); } if (newObj == null) { return new FieldIdentifier(obj, nextToken); } obj = newObj; } } } 从new()约束中删除无参数构造函数TValidator的约束。 从 DI 获得 IStringLocalizer<ErrorResource> 服务。 用Activator.CreateInstance()创建TValidator实例并提供Loc作为参数。 public class FluentValidator<TValidator> : ComponentBase where TValidator : IValidator { private readonly static char[] separators = new[] { '.', '[' }; private TValidator? validator; [CascadingParameter] private EditContext? EditContext { get; set; } [Inject] IStringLocalizer<ErrorResource> Loc { get; set; } protected override void OnInitialized() { if (EditContext != null) { validator = (TValidator)Activator.CreateInstance(typeof(TValidator), new object[] { Loc }); ... } } ... } 演示

回答 1 投票 0

ASP.NET Core Web API - 如何使用流利的验证器验证和格式化 start_date 和 end_date

在我的 ASP.NET Core-6 Web API 中,我得到了一个请求正文以使用 Fluent Validation 进行验证,然后传递到第三方 API。这是请求正文。 请求正文: { “结束日期”:...

回答 1 投票 0

当输入属性是对象列表时,FluentValidation 不会验证 List<string>

我有以下模型(为简洁起见进行了简化) 公共类 AdvancedFilter { 公共列表值{get;放; } } 然后我的 ApiController 如下 [HttpPost("测试&q...

回答 1 投票 0

.net6/FluentValidation:从另一个程序集注册所有验证器类不起作用

我想在我的 Web 项目的 program.cs 中注册所有位于另一层的验证器。但一个命令 services.AddValidatorsFromAssembly(AssemblyName) 不起作用。 我的

回答 0 投票 0

Mediatr 行为管道中的验证

我在我的 web api 2 项目中使用 Mediatr 4。与 FluentValidation 和 Unity 一起,我一直在添加管道行为来验证我的请求。 公共类 ValidationBehavior 我在我的 web api 2 项目中使用 Mediatr 4。与 FluentValidation 和 Unity 一起,我一直在添加管道行为来验证我的请求。 public class ValidationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IRequest<TResponse> { private readonly IEnumerable<IValidator<TRequest>> _validators; public ValidationBehavior(IEnumerable<IValidator<TRequest>> validators) { _validators = validators; } public Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next) { var context = new ValidationContext(request); var failures = _validators .Select(v => v.Validate(context)) .SelectMany(result => result.Errors) .Where(f => f != null) .ToList(); if (failures.Count != 0) { throw new ValidationException(failures); } return next(); } } 这一切都很好,但我真的很想能够在一个完整的响应中返回验证。我正在努力进行这样的更改,要么编译它,要么不让 Unity throw runtime 解决问题。 我在想有这样的东西: public class CommandResult : IResponseBase { private List<ValidationFailure> _validationFailures = new List<ValidationFailure>(); private readonly string _correlationid; public CommandResult(string correlationid) { _correlationid = correlationid; } public bool IsSuccess => _validationFailures.Count == 0; public static implicit operator bool(CommandResult result) { return result.IsSuccess; } public void AddFailures(List<ValidationFailure> results) { _validationFailures = results; } public List<ValidationFailure> Failures => _validationFailures; public string CorrelationId => _correlationid; } 在此基础上,我在行为中添加了一个约束: public class ValidationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IRequest<TResponse> where TResponse : IResponseBase, new() 但是尝试返回一个 CommandResult 而不是抛出异常给我带来了类型转换问题,感觉我让它变得太复杂了,我遗漏了一些非常基本的东西。 有两种类型的验证(至少) 请求数据验证 - 验证接收到的 HTTP 请求是否包含格式正确的所需数据。前任。 Email 字段是必需的,并且应该是有效的电子邮件地址** 特定于域的验证 - 验证Command 尝试应用于当前应用程序状态的修改从 domain prospective 是有效的。前任。 Email 必须是唯一的。 Email 不应该被blacklisted. 第一种类型的验证进入ActionFilter。 第二种类型的验证进入IPipelineBehavior 域命令模式 - 验证 让我为您的问题建议另一种方法。在您的请求命中控制器并且必须由 mediatr 路由之前,使用自定义 ActionFilterAttribute 而不是管道来执行验证。以下示例使用 Autofac 作为容器,但我希望您能理解并能够适当地修改代码。作为奖励 - 您的 Mediatr 请求或处理程序无需更改。验证将在调用控制器操作之前执行,并且在您有有效请求之前不会进一步执行。 public class ValidateModelStateFilter : ActionFilterAttribute, IAutofacActionFilter { private readonly IValidatorFactory _factory; /// <summary> /// Constructor /// </summary> /// <param name="factory"></param> public ValidateModelStateFilter(IValidatorFactory factory) { _factory = factory; } /// <summary> /// /// </summary> /// <param name="actionContext"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public override Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken) { base.OnActionExecutingAsync(actionContext, cancellationToken); IEnumerable<object> parameters = actionContext.ActionArguments.Select(x => x.Value).Where(x => x != null); foreach (var parameter in parameters) { Type argumentType = parameter.GetType(); if (argumentType == typeof(int) || argumentType == typeof(string)) { continue; } IValidator validator = _factory.GetValidator(argumentType); if (validator != null) { ValidationResult validationResult = validator.Validate(parameter); if (!validationResult.IsValid) { // place your formatting logic here. actionContext.Response = <your formatted response>; } } } return Task.FromResult(0); } } } 我喜欢这句话: 感觉我把它弄得太复杂了,我遗漏了一些非常基本的东西。 这个问题现在已经超过 5 年了,所以这个问题可能不再反映你的代码库,但像这样的问题似乎仍然会弹出,而且关于这个主题的文章也有写。 我不明白为什么那么多人想使用各种通用接口来为请求添加验证。 首先人们需要几个小时来设置它,然后讨论如何返回结果(确实抛出异常是糟糕的设计,但返回一个有用的对象应该不会那么难?)以及每次更新 MediatR包你需要担心是否所有的注册仍然有效。 我对 IGet 感到非常兴奋,它允许您通过愚蠢的简单代码创建“管道”,只需通过外部处理程序显式获取和调用处理程序。 IGet 只是实例化类并注入它们的依赖项,你可以随心所欲地使用它: public class MyRequestXPipeline { private ILogger<MyRequestXPipeline> _logger; private IGet i; public MyRequestXPipeline(IGet iget, ILogger<MyRequestXPipeline> logger) { _logger = logger; i = iget; } public async Task<Result<WhatWasAskedFor>> Handle(RequestX request) { var validationResult = i.Get<MyRequestXValidator>().Validate(request); if (!validationResult.IsValid) { return Result.Fail<WhatWasAskedFor>(validationResult.Message); } var whatWasAskedFor = i.Get<RequestXMainHandler>().Handle(request); var notification = new RequestXSucceeded { RequestX = request }; await i.Get<NotificationPublisher<RequestXSucceeded>>().PublishAsync(notification); // call other handlers, maybe do more stuff. return Result.Success(whatWasAskedFor); } } 不再依赖接口注册和 MediatR 调用await next(),您现在可以清楚地看到“管道”做了什么。

回答 3 投票 0

使用 MudBlazor 和 FluentValidation 更改其他字段时触发字段验证

我有一个带有两个开关的表格,我想确保至少有一个开关处于打开状态。如果出现这种情况,我还希望验证错误消息从任何开关中消失

回答 1 投票 0

FluentValidation 自动验证请求 .NET 7 Minimal API

我正在使用 FluentValidation 11.5.1。 我不想使用: // 地图发布 // public static void AddUser([FromBody] UserRequest, [FromServices] IValidator 验证器) 我希望它是自动的...

回答 1 投票 0

Telerik Blazor 向导(嵌套组件)上的 FluentValidation

我正在尝试使用 FluentValidation 将表单验证添加到 Telerik 向导,但我无法在按下向导的下一步按钮时显示 FluentValidation 消息。这就是...

回答 0 投票 0

Fluent 验证不验证数组中对象的字段

我有以下验证器。它在根级别的字段上按预期工作。但是,似乎没有对数组中对象的字段进行验证。 公开课

回答 0 投票 0

如何将 Fluent Validation 集成到 ASP.Net Core MVC 项目中?

我正在尝试将 Fluent Validation 11 集成到 ASP.Net Core MVC 7 项目中,但我无法使其正常工作。我已经安装了 FluentValidation.AspNetCore 包并添加了...

回答 0 投票 0

FluentValidation,需要 3 个中的 2 个

我正在尝试制作一个验证器,它可以处理总共 3 个道具中 2 个道具的任意组合。 因此,如果我有 A、B、C,那么如果任何 A-B、B-C、C-A 或 A-B-C 有效,则验证应该成功。 我写了...

回答 0 投票 0

将FluentValidation的错误发送到记录器

我正在注册我的FluentValidation验证器,如下所示: services.AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining的验证器。 ()); 如何才能掌握......

回答 1 投票 2

Razor Page中的流畅验证

基于这个页面,我试图做一个使用流畅验证的剃须刀页面。它似乎已经检查过了,但我不确定为什么错误信息不会显示。这是我目前所做的。...

回答 1 投票 0

FluentValidation。在子集合规则中使用父属性值。

我有这样一个验证器: public class InputValidator : AbstractValidator。 { public InputValidator() { RuleFor(inputData => inputData.Ucl).GreaterThan(0)......;.......。

回答 1 投票 0

FluentValidation。用其他属性的值自定义错误信息。

我有这样的方法。RuleForEach(inputData => inputData.Loads).ChildRules(inputData => { inputData.RuleFor(load => load.Asnow).GreaterThan或EqualTo(0).WithMessage("不允许出现负雪")......

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.