2013-04-19 15 views
5

Używam typu złożonego dla pola w modelu.Jak zastosować wymagany atrybut w modelu złożonym?

Mam pola w moim modelu o nazwie PersonDetails

public Phone PhoneDetails{get;set;} 

Telefon jest kolejny model zawierający trzy inne pola jak

int MobilePhone; 
int WorkPhone; 
int HomePhone; 

PersonDetails jest model, który ja przechodząc dodać popup. PersonDetails zawiera następujące pola:

public String Name{get;set;} 
public Phone PhoneDetails{get;set;} 
public string Address{get;set;} 

mogę zastosować Required atrybut Pole do pozostałych pól, ale chcę zastosować atrybut Required do PhoneDetails dziedzinie. Warunkiem jest, aby co najmniej jeden z trzech, tj. MobilePhone, WorkPhone lub HomePhone, miał wartość.

Jak mogę rozwiązać ten problem?

+1

Nie, nie można zastosować adnotacji "wymagane" do złożonych obiektów. Oznacza to, że możesz, ale walidacja nie będzie miała zastosowania. Możesz zastosować adnotację "wymagane" do każdej własności ... –

+0

@DaveA: Czy istnieje jakieś podejście, które będzie działało dla tego wzmocnienia. –

+0

@DaveA: Wymagany komunikat sprawdzania poprawności pola powinien zostać uruchomiony, jeśli wszystkie trzy pola są puste. Próbowałem rozwiązać ten problem, używając również sprawdzania poprawności niestandardowej, ale nie udało się. Czy możesz mnie poprowadzić w tej sprawie? –

Odpowiedz

2

Jedno podejście byłoby wdrożyć IValidatableObject:

public class PersonDetails : IValidatableObject 
{ 
    public string Name { get; set; } 
    public Phone PhoneDetails { get; set; } 
    public string Address { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (PhoneDetails.MobilePhone == 0 && PhoneDetails.WorkPhone == 0 && PhoneDetails.HomePhone == 0) 
      yield return new ValidationResult("Please enter at least 1 phone number", new[] { "PhoneDetails" }); 
    } 
} 

Formularz pokaże „Proszę podać co najmniej 1 numer telefonu”, jeżeli żaden z nich nie wszedł.

+0

Zastosowałem powyższe zmiany, ale ma to jeden problem. Daje to błąd czasu wykonywania, pokazujący "Dodaj odwołanie do ComponentModel.DataAnnotations" we wszystkich miejscach, w których model PhoneDetails jest używany w innych projektach. –

+0

Tak - powinieneś odwołać się do ComponentModel.DataAnnotations, ponieważ uważam, że interfejs znajduje się w tej bibliotece. Czy to problem? –

0

Do tego typu sprawdzania zawsze używam FluentValidation.

Pozwala to na znacznie bardziej złożonych scenariuszy walidacji niż atrybuty/adnotacji i jest bardzo zgodny z MVC (i cały kod .NET w ogóle)

Zastosowanie NuGet, aby dodać go do swojego projektu - mnóstwo przykładów i dokumentacji są dostępny.

Powiązane problemy