fluentvalidation 相关问题

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

关闭嵌套 blazor 自定义控件上的验证

这是针对 .NET 8 Blazor Web 应用程序的。 我有一个具有编辑器模板的网格,如下所示: @{ CurrentEditedItemSupplier =(上下文为 ItemSupplier)!; 这是针对 .NET 8 Blazor Web 应用程序的。 我有一个带有编辑器模板的网格,如下所示: <EditorTemplate> @{ CurrentlyEditedItemSupplier = (context as ItemSupplier)!; <HiSS.Body.Components.Custom.ItemSelector Items="@Items" CurrentItemSupplier="@CurrentlyEditedItemSupplier" Categories="@Categories" /> <TelerikValidationTooltip For="@(() => CurrentlyEditedItemSupplier.ItemId)" TargetSelector="#Item-field" Position="@TooltipPosition.Bottom"> </TelerikValidationTooltip> } 它包含一个具有 3 个组合框的自定义控件 (ItemSelector)。第一个是类别选择器,用于将项目记录过滤到较小的子集,另外两个链接到项目并显示其中的不同字段,允许用户从 ID 号或描述中进行选择。父网格绑定到 ItemSupplier 类型的对象。它不包含绑定到第一个组合框中的类别 ID。另外两个绑定到对象中的项目 ID。 <TelerikComboBox Id="Category-field" Data="@Categories" @bind-Value="@CurrentCategoryId" TextField="@nameof(Category.Name)" ValueField="@nameof(Category.Id)" OnChange="@FilterItems" Width="39%"> <ComboBoxSettings> <ComboBoxPopupSettings Class="dropdownsize;" /> </ComboBoxSettings> </TelerikComboBox> <TelerikComboBox id="Item-Desc" Data="@FilteredItems" @bind-Value="@CurrentItemSupplier!.ItemId" TextField="@nameof(Item.Description)" ValueField="@nameof(Item.Id)" Width="39%"> <ComboBoxSettings> <ComboBoxPopupSettings Class="dropdownsize;" /> </ComboBoxSettings> </TelerikComboBox> <TelerikValidationTooltip For="@(() => CurrentItemSupplier.ItemId)" TargetSelector="#Item-Desc" Position="@TooltipPosition.Bottom"> </TelerikValidationTooltip> <TelerikComboBox id="Item-ItemNo" Data="@FilteredItems" @bind-Value="@CurrentItemSupplier!.ItemId" TextField="@nameof(Item.ItemNo)" ValueField="@nameof(Item.Id)" Width="20%"> <ComboBoxSettings> <ComboBoxPopupSettings Class="dropdownsize;" /> </ComboBoxSettings> </TelerikComboBox> <TelerikValidationTooltip For="@(() => CurrentItemSupplier.ItemId)" TargetSelector="#Item-ItemNo" Position="@TooltipPosition.Bottom"> </TelerikValidationTooltip> 类别纯粹用于过滤项目以向用户提供较小的列表。不幸的是,验证不喜欢它存在,因为它不存在于验证模型中。如果我注释掉类别组合框,一切正常,但项目列表太大。如何进行验证以忽略自定义控件中的类别组合框? 结果非常简单 - 我所要做的就是将有问题的控件包装在它自己的编辑表单中: <EditForm Model="@dummymodel"> <TelerikComboBox Id="Category-field" Data="@Categories" @bind-Value="@CurrentCategoryId" TextField="@nameof(Category.Name)" ValueField="@nameof(Category.Id)" OnChange="@FilterItems" > <ComboBoxSettings> <ComboBoxPopupSettings Class="dropdownsize;" /> </ComboBoxSettings> </TelerikComboBox> </EditForm> 虚拟模型定义为: private object dummymodel = new object(); 而且效果很好...

回答 1 投票 0

“IValidationContext”不包含“CloneForChildValidator”的定义

我将流畅的验证包从 8.6.3 升级到 9.2.2 后收到此错误 有人可以帮忙吗? ` { 公共类PolymorphicValidator:NoopPropertyValidator 其中 TBaseClass : c...

回答 1 投票 0

使用 FluentValidation 验证 IEnumerable 模型时出现“无法应用索引器,因为属性链为空”错误?

我正在尝试使用 FluentValidation 验证 IEnumerable 模型,但我不断收到以下错误: System.InvalidOperationException:无法应用索引器,因为属性链为

回答 2 投票 0

如何使用 FluentValidation 实现基于角色的验证

我们有许多 Web api 服务当前使用 FluentValidation 和 SharpGrip.FluentValidation.AutoValidation 进行自动异步验证。 效果非常好。 目前

回答 1 投票 0

FluentEditForm 说没有数据,尽管输入的数据在那里

下面我的代码是一个流畅的编辑表单。我提交后,它说即使我填写了这些字段仍然需要填写。我的代码有什么问题吗? @page“/movieform” @

回答 1 投票 0

使用 FluentValidation 如何在控制器中使用validationContext进行测试

我设置了一个验证器,需要使用正在验证的视图模型之外的值。为此,我使用 ValidationContext 并分配 RootContextData,然后调用 validate 方法...

回答 1 投票 0

使用依赖注入模式和传递数据进行流畅的验证

我想将数据传递给流畅的验证。我认为这很简单,你可以在构造函数中完成。但我不想创建验证器的实例,而是注入它,这使得它变得很困难。 我有 :

回答 2 投票 0

对具有正文请求的 GET 请求使用 Fluent Validation 是一种不好的做法吗?

我正在尝试在我的项目中使用 Fluent Validator。到目前为止,我的大多数教程都是使用 post 请求,其中您有一个 json 正文作为对象,并且该对象将被验证...

回答 1 投票 0

空对象的 FluentValidation 规则

我一直在尝试创建一个 FluentValidation 规则,在验证其属性之前检查它正在验证的对象的实例是否不为空。 我宁愿封装...

回答 11 投票 0

使用 FluentValidation 进行更深入的数据库验证是不好的做法吗?

例如,您可以验证电话号码或电子邮件,这些都在 FV 文档中,但是如果您需要确保该电话号码尚未被经理“X”的员工使用怎么办?我...

回答 2 投票 0

使用 FluentValidation 验证集合,返回属性的规则失败错误

我刚刚开始使用 FluentValidation v9.x,想知道如何验证集合中的规则。 基本上如果我有一系列物质 公共类物质 { 公共整数?

回答 2 投票 0

如何使用 MediatR 和 FluentValidation 实现通用 ValidationBehavion,以便 ValidationBehavion 仅在命令上触发

我正在使用 CQRS 并为了分隔命令和查询而创建了自定义接口,因此我希望我的 ValidationBehavion 仅在继承 IRequest 的自定义 ICommand 上触发 我正在使用 CQRS 并分离命令和查询,我创建了自定义接口,因此我希望我的 ValidationBehavion 仅在继承 IRequest 的自定义 ICommand 上触发,而不是在所有 IRequest 请求上触发。 为了分离命令和查询,我创建了自定义界面: (作为响应值,我使用 ErrorOr 库。但我认为不值得研究它,只需记住命令和查询总是有响应) public interface ICommand<TResponse> : IRequest<ErrorOr<TResponse>> { } public interface IQuery<TResponse> : IRequest<ErrorOr<TResponse>> { } public interface ICommandHandler<TCommand, TResponse> : IRequestHandler<TCommand, ErrorOr<TResponse>> where TCommand : ICommand<TResponse> { } public interface IQueryHandler<TQuery, TResponse> : IRequestHandler<TQuery, ErrorOr<TResponse>> where TQuery : IQuery<TResponse> { } 我知道一种标准方法,其中 IPipelineBehavior 会向任何请求者触发,然后我们检查该请求者是否有验证器: public class ValidationBehavion<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IRequest<TResponse> where TResponse : IErrorOr { private readonly IValidator<TRequest>? _validator; public ValidationBehavion(IValidator<TRequest>? validator = null) { _validator = validator; } public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next, CancellationToken cancellationToken) { if(_validator is null) { return await next(); } var validationResult = await _validator.ValidateAsync(request); if (validationResult.IsValid) { return await next(); } var validationErrors = validationResult.Errors .ConvertAll(error => Errors.Wands.NotValid( error.PropertyName, error.ErrorMessage)); return (dynamic)validationErrors; } } 由于命令和查询是分离的,我想我可以指定 ICommand 而不是 IRequest 并重做 ValidationBehavion,如下所示: public class ValidationBehavion<TRequest, TResponse> : IPipelineBehavior<TRequest, ErrorOr<TResponse>> where TRequest : ICommand<TResponse> { private readonly IValidator<TRequest> _validator; public ValidationBehavion(IValidator<TRequest> validator) { _validator = validator; } public async Task<ErrorOr<TResponse>> Handle(TRequest request, RequestHandlerDelegate<ErrorOr<TResponse>> next, CancellationToken cancellationToken) { var validationResult = await _validator.ValidateAsync(request); if (validationResult.IsValid) { return await next(); } var validationErrors = validationResult.Errors .ConvertAll(error => Errors.Wands.NotValid( error.PropertyName, error.ErrorMessage)); return validationErrors; } } 但是这个 IPipelineBehavior 根本不起作用,我不知道为什么。 您可能需要注册该行为。你的startup.cs应该看起来像这样: public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddMediatR(typeof(Startup)); services.AddValidatorsFromAssemblyContaining<Startup>(); // Register pipeline behaviors services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(AuthorizationBehavior<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(PerformanceBehavior<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(UnhandledExceptionBehavior<,>)); // Register request pre-processors and post-processors services.AddTransient(typeof(IRequestPreProcessor<>), typeof(ValidationPreProcessor<>)); services.AddTransient(typeof(IRequestPostProcessor<,>), typeof(LoggingPostProcessor<,>)); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } } 您在这里有完整的教程:https://argosco.io/using-ipipelinebehavior-irequestpreprocessor-and-irequestpostprocessor-in-a-net-core-api/net/

回答 1 投票 0

IPipelineBehavior ValidationBehavior 在 MediatR 中注册时不会被触发

我将使用 LangExt 库的 Result 替换所有异常。问题是 ValidationBehavior 甚至没有被触发。它曾经在方法签名曾经是公开的时候触发...

回答 1 投票 0

如何从多个程序集注册 FluentValidation

我如何添加在多个程序集中进行验证的流畅验证。 我在共享类库中也有验证器: 公共类 TestModelValidator :AbstractValidator 如何添加在多个程序集中进行验证的流畅验证。 我在共享类库中也有验证器: public class TestModelValidator : AbstractValidator<TestModel> { rules... } public class TestModel2Validator : AbstractValidator<TestModel2> { rules... } ... public class TestMode999Validator : AbstractValidator<TestMode999> { rules... } in my startup.cs: services.AddValidatorsFromAssemblyContaining<Startup>(); services.AddFluentValidationAutoValidation(); services.AddFluentValidationClientsideAdapters(); 安装包FluentValidation.AspNetCore 然后你可以使用这样的扩展方法: services.AddFluentValidation(fv => { fv.RegisterValidatorsFromAssembly(Assembly.GetExecutingAssembly()); fv.RegisterValidatorsFromAssemblyContaining<Assembly1Class>(); fv.RegisterValidatorsFromAssemblyContaining<Assembly2Class>(); }); 或者您可以使用方法 fv.RegisterValidatorsFromAssemblies() 并传递程序集列表。

回答 1 投票 0

验证规则取决于使用流畅验证的独立规则组的成功

我正在尝试为这种情况想出正确的语法: 规则A 规则B 以上两者都是独立的 规则 C - 仅当 RuleA 和 RuleB 通过验证时才会运行。 例子: 用户 ID 存在 (...

回答 1 投票 0

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

我开始在 WPF 项目上使用 FluentValidation,到目前为止,我以一种简单的方式使用它来检查字段是否已填充或少于 n 个字符。 现在我必须检查是否插入了值(其中...

回答 3 投票 0

如何使用 FluentValidation 将字符串验证为日期时间

使用 FluentValidation,是否可以将字符串验证为可解析的 DateTime,而无需指定 Custom() 委托? 理想情况下,我想说类似 EmailAddress 函数的东西,...

回答 4 投票 0

流畅的验证 - 日期格式 yyyy-mm-dd

我已经搜索过,似乎找不到答案。 我正在尝试验证具有日期时间属性的出生日期。 RuleFor(c => c.Customer.DateOfBirth).NotEmpty().WithMessage...

回答 1 投票 0

使用 Generic 进行 Fluent 验证时出错

我正在尝试创建一个通用类以进行流畅的验证。参考下面的代码。 公共抽象类 GenericValidator : AbstractValidator { /// /// 我正在尝试创建一个通用类来进行流畅的验证。请参考以下代码。 public abstract class GenericValidator<T> : AbstractValidator<T> { /// <summary> /// Validates a string property to ensure it is not null, not empty, and meets a minimum length requirement. /// </summary> /// <param name="propertyValue">The string value to validate.</param> /// <param name="propertyName">The name of the property being validated.</param> /// <param name="minLength">The minimum length the string must have.</param> /// <param name="errorMessage">The error message format.</param> /// <returns>Returns a rule builder for further customization.</returns> protected IRuleBuilderOptions<T, string> ValidateString( Func<T, string> propertyValue, string propertyName, int minLength = 0, string errorMessage = "{PropertyName} is invalid.") { return *RuleFor*(propertyValue) .NotNull().WithMessage($"{propertyName} cannot be null.") .NotEmpty().WithMessage($"{propertyName} cannot be empty.") .MinimumLength(minLength).WithMessage($"{propertyName} must be at least {minLength} characters long.") .WithMessage(errorMessage); } } 我收到错误 “CS0411 无法从用法中推断出方法 'AbstractValidator.RuleFor(Expression>)' 的类型参数。尝试为“RuleFor”方法显式指定类型参数。 我对通用药物的了解有限。我尝试解决同样的问题但无法解决。 任何输入都会有帮助。为此,我使用版本 11* 的 Fluent 验证包。 需要采取什么措施来解决该错误? 正如错误消息所示:尝试为“RuleFor”显式指定类型参数。 return RuleFor<string>(propertyValue) ...

回答 1 投票 0

在 Fluentvalidation 中使用 SetValidator 验证通用集合

我正在尝试验证泛型类型: 公共类请求其中T:类 { 公共 int 测试 { 得到;放; } 公共列表记录{获取;放; } = []; } 如何设置

回答 1 投票 0

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