2010-12-02 6 views
4

Gibt es eine Validierungsregel für Datenannotation für eine sammlungbasierte Eigenschaft?MVC Dataannotation Validierungsregel für eine Sammlung?

Ich habe folgende

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

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

Ich bin für einen Validator suchen, die mich auf die TechnicalServices Eigenschaft hinzufügen kann, ein Minimum für die Sammlung Größe einzustellen.

Antwort

6

Ich denke, so etwas wie diese helfen kann:

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; 
    }  
} 

Es gibt Raum für Verbesserungen, aber das ist ein Arbeitsbeginn.

+0

Gute Antwort CGK! – Francisco

0

Eine weitere Option von .NET 4 weiter wäre, die Klasse selbst (die die Sammlung betreffende Eigenschaft enthält) zu machen implementieren IValidatableObject, wie zum Beispiel:

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 

Die Validator in DataAnnotations wird diese Validate-Methode automatisch aufrufen für alle IValidatableObjects.

Verwandte Themen