2011-11-15 16 views
5

Używam w moim projekcie Fluent Validation.
W moim ViewModel Mam właściwość, która jest typu ciąg, poprawne wartości są tylko ciąg znaków reprezentujących pozytywne liczby całkowite.
Tak więc utworzyłem prosty IntegerValidator, który sprawdza, czy ciąg może być przetwarzany na liczbę całkowitą. To działa.
Problem polega na tym, w jaki sposób dodać regułę, że musi to być dodatnia liczba całkowita? Chciałbym użyć istniejącego Greater Than Validator, ale powiązanie go z regułą dla mojej właściwości ciągu porównałoby ją jako string, a nie jako parsowane int. Jak to osiągnąć?Łańcuchowe reguły zależą od siebie

próbka tego, co chciałbym zrobić (należy zwrócić uwagę na ToInt()):

RuleFor(x => x.BatchNumber).SetValidator(new IntegerValidator()) 
          .ToInt().GreaterThan(0); 
+0

To naprawdę ma sens! Zastanawiam się jednak, jaka powinna być rola ToInt. Jak widzę, powinien przekonwertować 'RuleBuilder ' na 'RuleBuilder ' i upewnić się, że zweryfikowana wartość jest konwertowana na 'int' w czasie sprawdzania poprawności. Ale ... łańcuch metod powinien zwrócić 'RuleBuilder '. Dobrze? Tak więc, musi istnieć sposób, aby poinstruować kolejne reguły 'int' (jak' GreaterThan'), aby wykonać walidację 'int', ale zwróciło konstruktora reguł' string'. Obawiam się, że jest to poza obecnymi możliwościami FluentValidation. –

+0

@GertArnold: Cóż, "ToInt" nie ma zbytniego sensu, jak sądzę. Właściwie to nie obchodzi mnie * jak * to zadziała, po prostu * mogę użyć 'GreaterThan' i że int jest przekazywane do' GreaterThan'. –

+0

Ok, moim głównym punktem jest to, że w obecnym nastawieniu Fluent Validation może to być problem koncepcyjny. –

Odpowiedz

1

Można zawsze użyć metody niestandardowej ...

RuleFor(x=>x.BatchNumber).Must(BeAPositiveIntegerString); 

private bool BeAPositiveIntegerString(string batchNumber) 
{ 
    // check both parse ability and greater than (once parsed) 
} 

Mniej ponownego wykorzystania, ale będzie działać ...

+0

Oczywiście, mogę to zrobić, bez żadnych wątpliwości. Ale właśnie tego chcę uniknąć i dlaczego zapytałem w pierwszej kolejności :) –

+0

Nie mogę znaleźć sposobu na przesłanie 'RuleBuilder ' do 'RuleBuilder '. Hierarchia tych klas wymaga głębokiej zmiany w kodzie FluentValidator, ale wspomnę o nich; Widzę podobne przypadki użycia. W tym konkretnym przypadku (aby dać ci inną odpowiedź), możesz zawsze połączyć walidator, który sprawdza znak ujemny w ciągu znaków. ;) – drharris

Powiązane problemy