Jak mam napisać niestandardową ValidationAttribute, która porównuje dwa pola? Jest to typowy scenariusz "Wprowadź hasło", "Potwierdź hasło". Muszę mieć pewność, że te dwa pola są równe i aby zachować spójność, chcę zaimplementować walidację za pomocą DataAnnotations.Używanie DataAnnotations do porównywania dwóch właściwości modelu
Więc w pseudo-kodzie, szukam sposobu, aby zaimplementować coś podobnego do poniższego:
public class SignUpModel
{
[Required]
[Display(Name = "Password")]
public string Password { get; set; }
[Required]
[Display(Name = "Re-type Password")]
[Compare(CompareField = Password, ErrorMessage = "Passwords do not match")]
public string PasswordConfirm { get; set; }
}
public class CompareAttribute : ValidationAttribute
{
public CompareAttribute(object propertyToCompare)
{
// ??
}
public override bool IsValid(object value)
{
// ??
}
}
Więc pytanie brzmi, jak mogę Kodeksu [por] ValidationAttribute?
W tym przypadku można zapisać sam atrybut Wymagana dla drugiej właściwości, ponieważ już wymuszasz porównanie z pierwszą właściwością, która w rzeczywistości jest wymagana. –
Należy zauważyć, że od wersji C# 6.0 można teraz używać słowa kluczowego 'nameof', zamiast używać" ciągów magicznych "jako nazw właściwości.Pozwala to na lepsze/łatwiejsze refaktoryzowanie dowolnych powiązanych właściwości, ponieważ zamiast tego używa nazwy mocno wpisanej właściwości (i oszczędza konieczność pamiętania, aby zaktualizować magiczny ciąg znaków (tak jak zrobiłem to kilka razy)). Dodatkowo, kompilator popełni błąd, jeśli kiedykolwiek opuścisz go, w jakiś sposób - czyniąc go "niezawodny". Przykład użycia jak na odpowiedź @ Janx: '[CompareAttribute (nameof (NewPassword), ErrorMessage =" Hasła nie pasują. ")]' –