具有StringComparison的EF核心新验证属性DeniedValues不起作用:

[DeniedValues("bad", "lol", StringComparison.OrdinalIgnoreCase)]
public string Name { get; set; } = "";

有什么解决办法吗?

推荐答案

验证不是由EF Core执行,而是由System.DataModel.DataAnnotations中的类执行.DeniedValuesAttribute使用Equals来执行类型的默认相等性判断.它不允许通过标志或比较器进行变化:

    public override bool IsValid(object? value)
    {
        foreach (object? denied in Values)
        {
            if (denied is null ? value is null : denied.Equals(value))
            {
                return false;
            }
        }

        return true;
    }

你必须创建自己的自定义验证属性来使用不区分大小写的比较,可能是这样的:

[CLSCompliant(false)]
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
public class DeniedStringValuesAttribute(StringComparison comparisonType,params string?[] values) 
    : DeniedValuesAttribute (values)
{
    public StringComparison ComparisonType { get; }=comparisonType;

    public override bool IsValid(object? value)
    {
        foreach (string? denied in Values)
        {
            if (String.Equals(denied,value as string,ComparisonType))
            {
                return false;
            }
        }

        return true;
    }
}

Csharp相关问答推荐

MongoDB实体框架核心:表达必须可写

MongoDB将JS查询转换为C#的问题

Azure Redis缓存与Entra ID身份验证

如何在Windows 11任务调度程序中每1分钟重复一次任务?

如何使datagridview的列具有响应性,以便不是所有列都更改其宽度

mocking对象的引发事件并作为用于调用方法的参数对象传递到那里

在静态模式下实例化配置

为什么在使用动态obj+类obj时会调用串联?

单行上的ReSharper数据标注

Unix上的.NET(核心):.NET意外地未看到通过P/Invoke系统调用对环境变量进行的进程内修改

当前代码Cosmos DB 3.37.1:PartitionKey key key mismatch exception

HttpClient 415不支持的媒体类型错误

在C#中反序列化/序列化具有混合元素顺序的XML时出现问题

当空判断结果赋给变量时,为什么会出现可能空异常警告的解引用?

在C#ASP.NET内核中使用INT AS-1进行控制器场景的单元测试

在等待OnGetAsync时打开Razor Page显示微调器

如何在单击按钮后多次异步更新标签

如何在ASP.NET Core 8中获取键控服务词典

使DefaultIfEmpty返回空

嵌套Blazor组件内的验证