2016-04-29 7 views
1

verwendet wird. Warum wird bei der Validierung von Datenanmerkungen nur scheinbar (korrekt) überprüft, wenn ein get-Accessor für die Eigenschaft verwendet wird, die Sie validieren möchten?Datenannotation wird nur validiert, wenn get accessor für Feld

Bei dem folgenden Beispiel die Name Eigenschaft wird immer als gültig angesehen, auch wenn es nicht zugewiesen ist, aber die Address Eigenschaft wird nur als gültig angesehen werden, wenn sie einen nicht leeren String-Wert zugewiesen, alle, weil es eine get Accessor ist mit . Warum ist das?

Sicher TryValidateObject wird im Grunde nur test.Address verwenden, um den Wert zuzugreifen, ob es durch einen get Accessor ist oder nicht.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var test = new Test(); 
     var _errors = new List<ValidationResult>(); 

     bool isValid = Validator.TryValidateObject(
      test, new ValidationContext(test), _errors, true); 
    } 
} 

public class Test 
{ 
    [Required] 
    public string Name; // Returns true even when unassigned/null/empty string 

    [Required] 
    public string Address { get; } // Only returns true when assigned a non-empty string 
} 
+0

Es konnte eine Korrelation zwischen den automatisch generierten Eigenschaften sein, die von dem Compiler generiert werden, wenn Sie verwenden {get;} ich eine kleine Forschung tat und wenn ich Recht der Compiler bin ein Privateigentum für {get} –

+1

ich bauen Ich rate nur hier, aber vielleicht weil dein Name keine Eigenschaft ist, sondern ein öffentliches Feld. Man könnte also annehmen, dass die Logik hinter den Validatoren nur versucht, den Wert von Eigenschaften zu erhalten ... und niemand sollte trotzdem ein öffentliches Feld schreiben. –

+0

@MichaelFaisst Interessant, Sie könnten Recht haben. Es erscheint seltsam, dass das erforderliche Attribut immer noch in einem öffentlichen Feld verwendet werden kann, obwohl es nicht mit ihnen zu arbeiten scheint. – iswinky

Antwort

2

Der Grund ist Validator.TryValidateObject nur Eigenschaften überprüfen wird und Klasse-Ebene Anmerkungen, aber Ihre Name ist ein Feld, nicht eine Eigenschaft (siehe here dass die Dokumentation von Validator Klasse nicht erwähnt Felder). Wenn Sie ein anderes Attribut (wie Range) auf ein Feld anwenden, funktioniert es auch nicht mit Validator.TryValidateObject. Der Grund, warum RequiredAttribute auf ein Feld angewendet werden kann, liegt darin, dass RequiredAttribute eine Entität für sich ist und in keiner Weise mit der Validator-Klasse verbunden ist. Jeder andere Validierungsmechanismus kann öffentliche Felder validieren, es ist nur spezifische Validator Klasse, die nicht funktioniert.