我遇到了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.");
Run Code Online (Sandbox Code Playgroud)
发生的事情是AgeMin属性为null,因此第一次NotNull()检查失败,验证消息显示为"'Proposal Detail.Ige Min'不能为空." Proposal Detail是封装视图模型的名称.我已经尝试将整个验证器的CascadeMode设置为CascadeMode.Continue,但它没有任何效果.
如何为一个属性验证链完成一条消息?
Geo*_*vos 10
更新2
事实证明,您可以使用简单的扩展方法完成您想要的任务
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1910 次 |
| 最近记录: |