Własny walidator porównujący TimeSpan

Własny walidator porównujący TimeSpan
J7
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam,

Potrzebuję porównać dwie wartości typu TimeSpan aby sprawdzić czy jedna jest większa od drugiej,
Jednak otrzymuje pewien błąd którego nie rozumiem ponieważ wydaje się że wszystko jest w porządku.

Walidator:

Kopiuj
public class IsBigger : ValidationAttribute
    {
        public string Time { get; private set; }

        public IsBigger(string time)
        {
            Time = time;
        }

        public override bool IsValid(object value)
        {
            var properties = TypeDescriptor.GetProperties(value);
            var timeValue = (TimeSpan?)(properties.Find(Time, true).GetValue(value));

            if (value == null || timeValue == null)
                return true;

            if (TimeSpan.Compare((TimeSpan)value, (TimeSpan)timeValue) == 1)
                return true;

            if (TimeSpan.Compare((TimeSpan)value, (TimeSpan)timeValue) == 0)
                return true;

            return false;
        }
    }

Klasa w której wykorzystuje walidator:

Kopiuj
    public class TimeEngineModel
    {
        [Required]
        [DataType(DataType.Time)]
        public TimeSpan TimeStart { get; set; }

        [Required]
        [DataType(DataType.Time)]
        [IsBigger("TimeStart", ErrorMessage = "Data końca zajęć musi być większa od początkowej")]
        public TimeSpan TimeFinish { get; set; }
    }

Błąd otrzymuję przy linii gdzie przypisuje zmienna "var timeValue":
Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.

Gdy przeniosę walidator nad klasę w której stosuję atrybut mojej walidacji, komunikat wyświetla się przy instrukcji
"(TimeSpan.Compare((TimeSpan)value, (TimeSpan)timeValue) == 1)":
Określone rzutowanie jest nieprawidłowe.

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
public class IsBigger : ValidationAttribute

Huh? klasa nie będąca atrybutem dziedzicząca po atrybucie?
nie powinno być przypadkiem

Kopiuj
[Validation]
public class IsBigger
somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
1

@jawka7, trzymaj się może starej, dobrej zasady: "jedna linjka - jedna kropka". Gdybyś to podzielił na cztery linijki:

Kopiuj
var timeValue = (TimeSpan?)(properties.Find(Time, true).GetValue(value));

to błąd znalazłbyś prawdopodobnie szybko sam.

Zmienna value zawiera sprawdzaną wartość. W Twoim przypadku jest ona typu TimeSpan. Ty w obiekcie typu TimeSpan próbujesz znaleźć właściwość o nazwie "TimeStart", co się oczywiście nie udaje, więc metoda Find zwraca null.

Powinieneś w ogóle użyć innej wersji metody IsValid:

Kopiuj
protected override ValidationResult IsValid(object value, ValidationContext validationContext)

Tutaj, w obiekcie validationContext masz dostęp do sprawdzanego typu (validationContext.ObjectType) - i to na nim powinieneś wywołać metodę Find, natomiast dostęp do sprawdzanego obiektu masz we właściwości: validationContext.ObjectInstance, i to na nim powinieneś wywoływać metodę GetValue.

J7
  • Rejestracja: dni
  • Ostatnio: dni
0

Szczerze to ja już nie rozumiem uczą nas czegoś a okazuje się że to jest źle,
Ten przykład który ci podałem praktycznie oparty jest na laboratoriach z moich zajęć,
nie pomyślałbym że to może być źle i żeby poszukać czegoś innego w sieci,
pomyślałem że skoro pokazuję nam to gość który ma tylu letnie doświadczenie to to powinno być przynajmniej poprawne.
Czyli wychodzi na to że olewają nas i podają nam błędne instrukcje na odczep?

Tutaj adres do instrukcji na której się opierałem:
http://iisi.pcz.pl/lb/ZPI/ZPI_Instrukcja_5.pdf

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
0
jawka7 napisał(a):

nie pomyślałbym że to może być źle i żeby poszukać czegoś innego w sieci,
pomyślałem że skoro pokazuję nam to gość który ma tylu letnie doświadczenie to to powinno być przynajmniej poprawne.

Nie ufaj nikomu, a zwłaszcza wykładowcom. ;)

Ale może o to chodzi w studiowaniu, aby nie ograniczać się tylko tego, co na zajęciach, ale i samemu szukać rozwiązań?

Tutaj adres do instrukcji na której się opierałem:
http://iisi.pcz.pl/lb/ZPI/ZPI_Instrukcja_5.pdf

Jeśli chodzi o PeselModelAttribute, to nie ma prawa zadziałać tak, jak chciałby tego Pan wykładowca.

J7
  • Rejestracja: dni
  • Ostatnio: dni
0

W sumie na jego miejscu tez nie chciałbym sobie robić konkurencji,
chcesz coś umieć ucz się sam, już teraz na pewno nie bedę się sugerowała żadnymi instrukcjami ;)

Dzięki wielkie!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.