2011-11-10 18 views
5

Necesito comprobar el valor de Page.IsValid en cada carga/devolución de datos de una página para poder realizar otra lógica.Comprobando si una página es válida incluso cuando CausesValidation es falsa

Sin embargo, no se puede llamar a IsValid si no se ha llamado a Page.Validate().

No se invocará Page.Validate() si el control que se envió hacia atrás tenía CausesValidation establecido en falso.

Si llamo a Page.Validate() yo mismo, hace que se muestren todos los validadores en la página.

Actualmente tengo dos soluciones para este problema.

Primer método, utilizo una captura de prueba alrededor de IsValid. Capté la excepción que ocurrirá si la validación no se ha producido. Luego llamo a Page.Validate, verifico el valor de IsValid, luego recorro todos los validadores para marcarlos como válidos para que no aparezcan en la página.

bool isValid = false; 

try 
{ 
    isValid = this.IsValid; 
} 
catch (System.Web.HttpException exception) 
{ 
    if(exception.Message == "Page.IsValid cannot be called before validation has taken place. It should be queried in the event handler for a control that has CausesValidation=True and initiated the postback, or after a call to Page.Validate.") 
    { 
     //Validation has NOT occurred so run it here, store the result, then set all the validators to valid. 
     this.Validate(); 
     isValid = this.IsValid; 

     foreach (IValidator validator in this.Validators) 
     { 
      validator.IsValid = true; 
     } 
    } 
} 

Segundo método, es utilizar la reflexión para obtener el campo _validado de la página subyacente. Luego hago lo mismo que el primer método para llamar Validar si la página no ha sido validada y luego restablecer todos los Validadores después.

bool isValidated = (bool)typeof(Page).GetField("_validated", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(this); 

bool isValid = false; 

if (isValidated) 
{ 
    isValid = this.IsValid; 
} 
else 
{ 
    this.Validate(); 
    isValid = this.IsValid; 

    foreach (IValidator validator in this.Validators) 
    { 
     validator.IsValid = true; 
    } 
} 

no me gusta ninguna de estas soluciones como que no me gusta de codificación por excepciones y no me gusta usar la reflexión para llegar a la propiedad validado como debe haber habido alguna razón se mantiene privado en El primer lugar.

¿Alguien más tiene mejores soluciones o alguna idea?

+0

Es algo que tienes que hacer del lado del servidor? Puede ser más fácil realizar una carga de validación del lado del cliente. –

+0

@JamesJohnson El código que tengo que ejecutar en Válido/Inválido tiene que ejecutarse en el lado del servidor, sí. Aunque incluso si pudiera ser del lado del cliente, no veo cómo eso ayudaría, ya que aún tendría que verificar si la página es válida sin que los validadores se activen/muestren. –

+0

¿Qué hay de usar un ValidationGroup específico y usar la sobrecarga Page.Validate (String)? – sisve

Respuesta

9

Le sugiero que simplemente use sus validadores con la opción EnableClientScript configurada como falsa.

De esta manera, usted será capaz de llamar

if (this.Page.IsValid) 

en el código.

Si desea validar un grupo de validación específico, sólo tiene que utilizar esta línea en el lado del servidor:

Page.Validate("ValidationGroupName") 

vistazo a estas examples of group validation

Cuestiones relacionadas