gpt4 book ai didi

c# - 规则链的一条消息?

转载 作者:太空狗 更新时间:2023-10-29 20:02:34 27 4
gpt4 key购买 nike

我在使用 FluentValidation 时遇到问题,无论给定链中的验证错误如何,我都想显示一条消息。例如,我为下面的一个属性定义了一个验证链。我希望对链进行评估,并且任何失败都会导致在下面的 WithMessage() 调用中定义的消息。但是,它似乎短路了,只显示遇到的第一个错误的 FluentValidation 默认错误消息。见下面的代码:

RuleFor(s => s.ProposalDetail.AgeMin).NotNull()
.GreaterThanOrEqualTo(1)
.LessThanOrEqualTo(99)
.WithMessage("Minimum Age entry is required and must range from 1 to 99 years.");

发生的情况是 AgeMin 属性为空,因此第一个 NotNull() 检查失败,验证消息显示为“'Proposal Detail.Age Min' must not be empty”。 Proposal Detail 是封装 View 模型的名称。我已经尝试将整个验证器的 CascadeMode 设置为 CascadeMode.Continue,但它没有任何效果。

如何为一个属性验证链完成一条消息?

最佳答案

更新 4
我找到了一个更简单的解决方案,它适用于使用 Configure 方法的任何版本,因此不再需要我原来的“扩展方法”方法

using FluentValidation;
using FluentValidation.Results;
using System;
using System.Linq;

namespace ConsoleApplication9
{
class Program
{
static void Main(string[] args)
{

Customer customer = new Customer() { };
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);
Console.WriteLine(results.Errors.First().ErrorMessage);
Console.ReadLine();
}
}
public class CustomerValidator : AbstractValidator<Customer>
{

public CustomerValidator()
{
RuleFor(s => s.Id).NotNull()
.GreaterThanOrEqualTo(1)
.LessThanOrEqualTo(99)
.Configure(rule => rule.MessageBuilder = _ => "Minimum Age entry is required and must range from 1 to 99 years.");

}

}

public class Customer { public int? Id { get; set; } }
}

原始答案:它适用于版本 9,但比上面的更复杂
你可以用一个简单的扩展方法来完成你想要的

using FluentValidation;
using FluentValidation.Internal;
using FluentValidation.Resources;
using FluentValidation.Results;
using System;
using System.Linq;

namespace ConsoleApplication9
{
class Program
{
static void Main(string[] args)
{

Customer customer = new Customer() { };
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);
Console.WriteLine(results.Errors.First().ErrorMessage);
Console.ReadLine();
}
}
public class CustomerValidator : AbstractValidator<Customer>
{
public CustomerValidator()
{

RuleFor(s => s.Id).NotNull()
.GreaterThanOrEqualTo(1)
.LessThanOrEqualTo(99)
.WithGlobalMessage("Minimum Age entry is required and must range from 1 to 99 years.");
}

}

public class Customer { public int? Id { get; set; } }

public static class MyExtentions
{
public static IRuleBuilderOptions<T, TProperty> WithGlobalMessage<T, TProperty>(this IRuleBuilderOptions<T, TProperty> rule, string errorMessage)
{
foreach (var item in (rule as RuleBuilder<T, TProperty>).Rule.Validators)
item.Options.ErrorMessageSource=new StaticStringSource(errorMessage);

return rule;
}
}
}

下面的代码适用于任何版本,但由于它使用了 Must 方法,所以它不是很干净,您会怀念流畅界面的感觉。

using FluentValidation;
using FluentValidation.Results;
using System;
using System.Linq;

namespace ConsoleApplication9
{
class Program
{
static void Main(string[] args)
{
Customer customer = new Customer() { };
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);
Console.WriteLine(results.Errors.First().ErrorMessage);
Console.ReadLine();
}
}
public class CustomerValidator : AbstractValidator<Customer>
{
public CustomerValidator()
{
RuleFor(x => x)
.Must(x => x.Id != null && x.Id >= 1 && x.Id <= 99)
.WithMessage("Minimum Age entry is required and must range from 1 to 99 years.");
}
}
public class Customer { public int? Id { get; set; } }
}

更新 3:(2019 年 4 月 7 日)在 FluentValidation v8.2.2 中,IRuleBuilderOptions 接口(interface)不再直接访问 IRuleBuilderOptions.ErrorMessageSource 属性,我们应该使用:IRuleBuilderOptions.Options.ErrorMessageSource .

关于c# - 规则链的一条消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35513141/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com