Проверка на IEnumerable (коллекция строк) - PullRequest
2 голосов
/ 26 мая 2020

Это можно сделать только с помощью специального валидатора, или мне что-то не хватает? Просто хочу просто проверить свойство ICollection<string> на наличие хотя бы одного элемента.

Безуспешно:

 [Required]
 [MinLength(1, ErrorMessage = "At least one Something is required")]
 public ICollection<string> Somethings { get; set; }

Спасибо!

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Это практический пример реализации:

class Program
{
    static void Main(string[] args)
    {
        var iceCream = new BuyIcecreamRequest { Tastes = new List<string>() { "Chocolate" } };
        var results = new List<ValidationResult>();
        bool isValid = Validator.TryValidateObject(iceCream, new ValidationContext(iceCream), results, true);
    }
}

public class MinimumCollectionLength : ValidationAttribute
{
    private readonly int _minimumCollectionLength;

    public MinimumCollectionLength(int minimumCollectionLength)
    {
        _minimumCollectionLength = minimumCollectionLength;
    }

    public override bool IsValid(object value)
    {
        var collection = value as ICollection;
        if (collection != null)
        {
            return collection.Count >= _minimumCollectionLength;
        }
        return false;
    }
}

public class BuyIcecreamRequest
{
    [Required]
    [MinimumCollectionLength(1, ErrorMessage = "At least one Taste is required")]
    public ICollection<string> Tastes { get; set; }
}
1 голос
/ 26 мая 2020

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

public ICollection<string> Somethings { get; set; }

[Range(1, 9999, ErrorMessage = "At least one Something is required")]
public int SomethingsCount => Somethings == null ? 0 : Somethings.Count;

* 1004 дополнительное свойство к вашей модели, но если вы ленивы, то, возможно, это хороший вариант для вас.


Лучший вариант, согласно комментарию Дениса и этот ответ , вы можете определить свой собственный атрибут проверки

public class RequiredCollectionAttribute : ValidationAttribute
{
    public override bool IsValid(object value) => value is IList list && list.Count > 0;
}

И использовать его вот так

[RequiredCollection(ErrorMessage = "At least one Something is required")]
public ICollection<string> Somethings { get; set; }
...