如何使用 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ěŕ。我以为你是说它允许vic
和VIC
。此答案区分大小写。
没问题,只是不知道用户是否想要特定的灵敏度,他们没有提到这一点,我的假设与 OP 发布的内容不符。无论如何,这是一个比所选答案更好的选择。以上是关于如何使用 DataAnnotations 来检查一个属性只匹配一个字符串数组的主要内容,如果未能解决你的问题,请参考以下文章
如何覆盖DataAnnotations必需标记以允许条件客户端验证
如何使用 DataAnnotations & Regex - c# - ASP.NET Core
如何使用 DataAnnotations 处理 ASP.NET MVC 2 中的布尔值/复选框?
如何将 DataAnnotations ErrorMessageResourceName 与自定义资源解决方案一起使用