Как использовать DataAnnotations для проверки соответствия свойства только массиву строк - PullRequest
3 голосов
/ 06 февраля 2020

У меня есть атрибут:

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

для свойства с именем State, и я хочу, чтобы он совпадал только с 5 австралийскими штатами: { "VIC", "NSW", "QLD", "SA", "TAS", "WA" }. Как я могу использовать DataAnnotations для этого контекста?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

вы можете использовать RegularExpressionAttribute

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

, который должен разрешать только VI C, NSW, QLD, TAS, WA или SA

1 голос
/ 06 февраля 2020

Для этого вы можете создать атрибут, унаследованный от 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; }

Здесь мы используем метод Contains Линка * в массиве.

Если вам требуется опция без учета регистра, то, как указывает Кодексер, вы можете использовать:

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