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
}
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} –
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. –
@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