2010-12-02 46 views
4

Existe-t-il une règle de validation dataannotation pour une propriété basée sur une collection?MVC Règle de validation de l'annotation de données pour une collection?

Je donne les résultats suivants

<DisplayName("Category")> 
    <Range(1, Integer.MaxValue, ErrorMessage:="Please select a category")> 
    Property CategoryId As Integer 

    <DisplayName("Technical Services")> 
    Property TechnicalServices As List(Of Integer) 

Je cherche un validateur que je peux ajouter à la propriété TechnicalServices de fixer un minimum pour la taille de la collection.

Répondre

6

Je pense que quelque chose comme cela pourrait aider:

public class MinimumCollectionSizeAttribute : ValidationAttribute 
{ 
    private int _minSize; 
    public MinimumCollectionSizeAttribute(int minSize) 
    { 
     _minSize = minSize; 
    } 

    public override bool IsValid(object value) 
    { 
     if (value == null) return true; 
     var list = value as ICollection; 

     if (list == null) return true; 

     return list.Count >= _minSize; 
    }  
} 

Il y a place à l'amélioration, mais c'est un début de travail.

+0

Bonne réponse CGK! – Francisco

0

Une autre option de .NET 4 serait en avant est de faire la classe elle-même (qui contient la propriété de collection en question) mettre en œuvre IValidatableObject, tels que:

Public Class SomeClass 
    Implements IValidatableObject 

    Public Property TechnicalServices() As List(Of Integer) 
     Get 
      Return m_TechnicalServices 
     End Get 
     Set 
      m_TechnicalServices = Value 
     End Set 
    End Property 
    Private m_TechnicalServices As List(Of Integer) 

    Public Function Validate(validationContext As ValidationContext) As IEnumerable(Of ValidationResult) 
     Dim results = New List(Of ValidationResult)() 

     If TechnicalServices.Count < 1 Then 
      results.Add(New ValidationResult("There must be at least one TechnicalService")) 
     End If 

     Return results 
    End Function 
End Class 

Le Validator en DataAnnotations appellera automatiquement cette méthode Valider pour tout IValidatableObjects.