2013-03-19 5 views
11

I wprowadziły IValidatableObject kilka razy i nigdy nie dowiedział się, jaki jest cel przetwarzania ValidationContext metody sprawdzania poprawności jest - mój typowy IValidatableObject realizacja wygląda mniej więcej tak:Jaki jest cel ValidationContext przy wdrażaniu IValidatableObject

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
{ 
    if (Prop1 == Prop2) 
    { 
     yield return new ValidationResult(
       "Prop1 and Prop2 must be different.", 
       new[] {"Prop1", "Prop2"}); 
    } 
} 

Czy jest coś, co przegapiłem, mogłem użyć validationContext dla?

EDYCJA: Używam ASP.NET MVC i jest zaimplementowana w klasie - nie w kontroler.

Odpowiedz

6

ValidationContext zawiera IServiceProvider nieruchomości. Jest to punkt rozszerzenia do przekazania kontenera DI do atrybutów sprawdzania poprawności i metod sprawdzania poprawności. Można go użyć jako przykładu do sprawdzania poprawności w bazie danych bez ustawiania zależności w dbcontext w modelu.

+6

Pomoże podać przykład, jak przekazać kontener DI w tej konkretnej sytuacji. – Stack0verflow

+0

w asp.net mvc można to zrobić przy tworzeniu własnego dostawcy sprawdzania poprawności. –

+3

Czy możesz podać przykład tego? Naprawdę utknąłem, próbując poprawnie walidować i zobaczyć potencjalną odpowiedź bez kodu jest naprawdę smutne :( –

6

Powinieneś pobrać Prop1 i Prop2 z validationContext. Z twojego pytania trudno stwierdzić, czy korzystasz z WebForms (masz powiązanie kodu z właściwościami) czy MVC (i jeśli implementujesz to w kontrolerze).

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
{ 
    if (validationContext["Prop1"] == validationContext["Prop2"]) 
    { 
     yield return new ValidationResult(
       "Prop1 and Prop2 must be different.", 
       new[] {"Prop1", "Prop2"}); 
    } 
}