Проверка модели MVC с DataAnnotations - Любой способ сделать ICollection требуется? - PullRequest
3 голосов
/ 01 февраля 2012

У меня есть свойство в классе Model что-то вроде:

    /// <summary>
    /// A list of line items in the receipt
    /// </summary>      
    public ICollection<ReceiptItem> Items { get; set; }

Можно ли как-нибудь пометить это свойство, чтобы проверить, что в коллекции должно быть 1 или более членов? Я пытаюсь избежать ручного вызова функции проверки вне ModelState.IsValid

Ответы [ 3 ]

9 голосов
/ 01 февраля 2012

Я решил проблему с помощью пользовательской аннотации данных - не думал, что это можно сделать первым!

Вот мой код, если он кому-нибудь еще поможет!

/// <summary>
/// Require a minimum length, and optionally a maximum length, for any IEnumerable
/// </summary>
sealed public class CollectionMinimumLengthValidationAttribute : ValidationAttribute
{
    const string errorMessage = "{0} must contain at least {1} item(s).";
    const string errorMessageWithMax = "{0} must contain between {1} and {2} item(s).";
        int minLength;
        int? maxLength;          

        public CollectionMinimumLengthValidationAttribute(int min)
        {
            minLength = min;
            maxLength = null;
        }

        public CollectionMinimumLengthValidationAttribute(int min,int max)
        {
            minLength = min;
            maxLength = max;
        }

        //Override default FormatErrorMessage Method  
        public override string FormatErrorMessage(string name)
        {
            if(maxLength != null)
            {
                return string.Format(errorMessageWithMax,name,minLength,maxLength.Value);
            }
            else
            {
                return string.Format(errorMessage, name, minLength);
            }
        }  

    public override bool IsValid(object value)
    {
        IEnumerable<object> list = value as IEnumerable<object>;

        if (list != null && list.Count() >= minLength && (maxLength == null || list.Count() <= maxLength))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}
}
4 голосов
/ 01 февраля 2012

Реализация интерфейса IValidatableObject в классе модели и добавление пользовательской логики проверки в методе Validate.

public class MyModel : IValidatableObject
{
    public ICollection<ReceiptItem> Items { get; set; }

    public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Items == null || Items.Count() == 0)
        {
            var validationResult = 
             new ValidationResult("One or more items are required") { Members = "Items"};
            return new List<ValidationResult> { validationResult };
        }

        return new List<ValidationResult>();
    }
}
2 голосов
/ 27 марта 2012

С EF4 CodeFirst (EntityFramework.dll) теперь у вас есть MinLengthAttribute и MaxLengthAttribute , которые можно использовать в массиве / списке / коллекции.

Описание : Указывает минимальную длину массива / строковых данных, разрешенных в свойстве.

...