5

Wir haben in einigen unserer Logik die Notwendigkeit, die Eigenschaften eines Modells für die automatische Bindung von Eigenschaften zu durchlaufen und die Funktionalität um die neuen Datenannotationen in C# 4.0 zu erweitern.Wie ValidationAttributes manuell aufrufen? (DataAnnotations und ModelState)

Zur Zeit iteriere ich im Prinzip über jede Eigenschaft, die in alle ValidationAttribute-Instanzen geladen wird und versuche, die Validate/IsValid-Funktion zu validieren, aber das scheint für mich nicht zu funktionieren.

Als Beispiel ich ein Modell, wie zum Beispiel:

public class HobbyModel 
{ 
    [Required(AllowEmptyStrings = false, ErrorMessage = "Do not allow empty strings")] 
    [DisplayName("Hobby")] 
    [DataType(DataType.Text)] 
    public string Hobby 
    { 
     get; 
     set; 
    } 
} 

Und der Code, um die Attribute zu überprüfen ist:

object[] attributes = propertyInfo.GetCustomAttributes(true); 
TypeConverter typeConverter = 
TypeDescriptor.GetConverter(typeof(ValidationAttribute)); 

bool isValid = false; 
foreach (object attr in attributes) 
{ 
    ValidationAttribute attrib = attr as ValidationAttribute; 

    if (attrib != null) 
    { 
    attrib.Validate(obj, propertyInfo.Name); 
    } 
} 

ich den Code gedebuggt haben und das Modell hat drei Attribute , Von denen 2 von ValidationAttribute abgeleitet sind, aber wenn der Code die Validate-Funktion (mit einem leeren oder Null-Wert) durchläuft, wird eine Ausnahme wie erwartet ausgelöst.

Ich erwarte, dass ich etwas Dummes mache, also wundere mich, ob jemand diese Funktionalität benutzt hat und helfen könnte.

Vielen Dank im Voraus, Jamie

Antwort

3

Dies liegt daran, dass Sie anstelle des Eigenschaftswerts das Quellobjekt an die Methode Validate übergeben. Hier finden Sie eher wie erwartet funktionieren (wenn auch offensichtlich nicht für indizierte Eigenschaften):

attrib.Validate(propertyInfo.GetValue(obj, null), propertyInfo.Name); 

Sie sicherlich leichter using the Validator class wie Steven suggested haben würden, wenn.

4

Sie tun, um die System.ComponentModel.DataAnnotations.Validator Klasse verwenden, um Objekte zu validieren.

+0

Haben Sie ein Beispiel für die Verwendung von DataAnnotations 4.0 mit ASP.Net MVC 3.0, verwende ich derzeit 3.5 (das kann oder kann nicht funktionieren, ich aktualisiere Code von MVC 1.0 zu 3) – Jamie

+0

Wenn ich nicht bin irrtümlicherweise arbeitet MVC 2 und höher standardmäßig mit DataAnnotations, so dass Sie bei der Arbeit mit MVC 3 den Validator nicht manuell aufrufen müssen. – Steven

+0

Grundsätzlich möchten wir den Prozess in einen separaten Mechanismus auslagern, also in der Lage sein, die Validierung manuell durchzuführen und die Validierung manuell auszuführen. – Jamie