2011-11-15 25 views
5

Estoy usando Fluent Validation en mi proyecto.
En mi ViewModel tengo una propiedad que es de tipo cadena, los valores válidos son solo cadenas que representan enteros positivos.
Así que creé un simple IntegerValidator que verifica si la cadena se puede analizar en un entero. Esto funciona.
El problema es, ¿cómo agregar la regla de que debe ser un entero positivo? Me gustaría utilizar el Greater Than Validator existente, pero el encadenamiento a la regla de mi propiedad de cadena compararía como string, no como un analizada int. ¿Cómo lograr esto?Reglas de encadenamiento que dependen el uno del otro

muestra de lo que me gustaría hacer (tenga en cuenta la ToInt()):

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

Esto realmente tiene sentido! Sin embargo, me pregunto cuál debería ser el papel de ToInt. Tal como lo veo, debe convertir un 'RuleBuilder ' en un 'RuleBuilder ' y asegurarse de que el valor validado se convierta en 'int' en el momento de la validación. Pero ... la cadena de método debería devolver un 'RuleBuilder '. ¿Derecha? Entonces, debe haber una forma de ordenar reglas 'int' consecutivas (como' GreaterThan') para hacer una validación 'int', pero devuelve un' rulebuilder 'de cadena. Me temo que esto está más allá de las capacidades actuales de FluentValidation. –

+0

@GertArnold: Bueno, el 'ToInt' no tiene demasiado sentido, creo. De hecho, no me importa * cómo * va a funcionar, solo * que * puedo usar 'GreaterThan' y que una int se pasa a' GreaterThan'. –

+0

Ok, mi punto principal es que en la mentalidad actual de Validación fluida puede ser un problema conceptual. –

Respuesta

1

Siempre se puede utilizar un método personalizado ...

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

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

Menos reutilización pero funcionaría ...

+0

Claro, puedo hacerlo, sin lugar a dudas. Pero eso es exactamente lo que yo quiero evitar y por qué le pregunté en primer lugar :) –

+0

No puedo encontrar ninguna manera de lanzar un '' RuleBuilder a un '' RuleBuilder . La jerarquía de esas clases requiere un cambio profundo en el código de FluentValidator, pero una que les mencionaría; Puedo ver casos de uso similares. En este caso particular (para darle otra respuesta), siempre puede encadenar un validador que comprueba si hay un signo negativo en la cadena. ;) – drharris

Cuestiones relacionadas