如何使用 DataAnnotations 来检查一个属性只匹配一个字符串数组

Posted

技术标签:

【中文标题】如何使用 DataAnnotations 来检查一个属性只匹配一个字符串数组【英文标题】:How to use DataAnnotations to check a property only matches an array of string 【发布时间】:2020-05-22 14:13:28 【问题描述】:

我有一个属性:

[MaxLength(3)]
public string State  get; set; 

在名为 State 的属性上,我只希望它匹配给定的 5 个澳大利亚州: "VIC", "NSW", "QLD", "SA", "TAS", "WA" 。如何在这种情况下使用 DataAnnotations?

【问题讨论】:

【参考方案1】:

你可以使用RegularExpressionAttribute

[RegularExpression("VIC|NSW|QLD|TAS|WA|SA")]
[MaxLength(3)]
public string State  get; set; 

应该只允许 VIC、NSW、QLD、TAS、WA 或 SA

【讨论】:

@Krishna Muppalla 很棒的解决方案,这就是我正在研究的。 @BachDao,我很高兴它成功了!您可以将此标记为答案【参考方案2】:

您可以为此创建一个继承自 ValidationAttribute 的属性。

[AttributeUsage(AttributeTargets.Property, Inherited = true)]
public class StringRangeAttribute : ValidationAttribute
       
    public string[] AllowableValues  get; set; 

    public override bool IsValid(object value)
    
        string actualValue = value as string;

        if (AllowableValues?.Contains(actualValue) == true)
        
            return true;
        
        return false;
    

并像这样使用它:

[StringRange(AllowableValues = new string[]  "VIC", "NSW", "QLD", "SA", "TAS", "WA")]
public string State get; set; 

这里我们在数组上使用 Linq 的 Contains 方法。

如果您需要不区分大小写的选项,那么正如 Codexer 指出的那样,您可以使用:

if (AllowableValues?.Contains(actualValue?.ToUpper()) == true)

【讨论】:

if (AllowableValues?.Contains(actualValue) == true) 不允许说vic 而不是VIC?也许if (AllowableValues?.Contains(actualValue.ToUpper()) == true) 不,我不这么认为。包含区分大小写。 如果用户想要特定的值(区分大小写), contains 将不起作用,因为它不区分大小写,也许 OP 可以介入? 哦,我明白了,对不起。是的对不起,你是对的。取决于 OP 想要什么@Çöđěxěŕ。我以为你是说它允许vicVIC。此答案区分大小写。 没问题,只是不知道用户是否想要特定的灵敏度,他们没有提到这一点,我的假设与 OP 发布的内容不符。无论如何,这是一个比所选答案更好的选择。

以上是关于如何使用 DataAnnotations 来检查一个属性只匹配一个字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖DataAnnotations必需标记以允许条件客户端验证

如何使用 DataAnnotations & Regex - c# - ASP.NET Core

如何使用 DataAnnotations 处理 ASP.NET MVC 2 中的布尔值/复选框?

如何将 DataAnnotations ErrorMessageResourceName 与自定义资源解决方案一起使用

ASP.Net MVC开发基础学习笔记:四校验AJAX与过滤器

EF Code-First 学习之旅 DataAnnotations