gpt4 book ai didi

c# - FluentValidator 如何确定默认使用的显示名称?

转载 作者:行者123 更新时间:2023-12-04 08:44:33 28 4
gpt4 key购买 nike

我正在 .NET Core 中使用 FluentValidator。大多数情况下,一切都运行良好,但我注意到在处理复杂类型时,FluentValidator 会显示完整的属性名称。例如,假设我有一个名为 Address 的类,其中包含 Street、City、State 和 Zip 属性。现在假设我有一个由名为 Physical Address 的模型属性支持的表单。如果我要求街道,Fluent 会显示以下验证错误:'Physical Address. Street' must not be empty.我更喜欢这个,只是说“街道”不能为空,因为我可能在页面上有多个地址字段,所以只显示“街道”不够具体。但我宁愿让它说:'Physical Address Street' must not be empty. (字地址后没有句号)
FluentValidation 给出的全局覆盖显示名称的示例是在 Startup.cs 中添加以下内容:

ValidatorOptions.DisplayNameResolver = (type, member, expression) => {
if(member != null) {
return member.Name + "Foo";
}
return null;
};
覆盖示例有效,但使用此(减去 foo 部分)会显示此验证错误: 'Street' must not be empty. (我不想要的东西,因为它太通用了)
我需要知道的是 lambda 内部的哪些逻辑会产生与默认行为完全相同的结果(即 Physical Address. Street ,而不仅仅是 Street )。一旦我知道了这一点,我就可以通过一个简单的 defaultValue.Replace(".","") 来修复删除句点。 .谢谢!

最佳答案

更新:
更简单的方法是使用 ValidatorOptions.Global.PropertyNameResolver

ValidatorOptions.Global.DisplayNameResolver = (type, memberInfo, expression) =>
ValidatorOptions.Global.PropertyNameResolver(type, memberInfo, expression).SplitPascalCase();
原答案:
基于 github sources 准备了完整的演示
注意:我正在使用 ValidatorOptions.Global.DisplayNameResolver而不是 ValidatorOptions.DisplayNameResolver因为它已经过时,将在 future 版本中删除
using FluentValidation;
using FluentValidation.Internal;
using System;
using System.Linq.Expressions;
using System.Reflection;

namespace ConsoleApp4
{
public class Root
{
public PhysicalAddress PhysicalAddress { get; set; }
= new PhysicalAddress();
}

public class PhysicalAddress
{
public string Street { get; set; }
}

public class RootValidator : AbstractValidator<Root>
{
public RootValidator()
{
RuleFor(x => x.PhysicalAddress.Street).NotNull();
}
}

class Program
{
static string DefaultPropertyNameResolver(Type type, MemberInfo memberInfo, LambdaExpression expression)
{
if (expression != null)
{
var chain = PropertyChain.FromExpression(expression);
if (chain.Count > 0) return chain.ToString();
}

return memberInfo?.Name;
}

static void Main(string[] args)
{
ValidatorOptions.Global.DisplayNameResolver = (type, memberInfo, expression) =>
DefaultPropertyNameResolver(type, memberInfo, expression).SplitPascalCase();

var res = new RootValidator().Validate(new Root());
}
}
}

关于c# - FluentValidator 如何确定默认使用的显示名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64393710/

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