Veja a seguinte situação: Você tem um campo em um WebForm que é obrigatório apenas em uma determinada condição. O mesmo campo, em outra condição NÃO é de preenchimento obrigatório. Você poderia usar um RequiredFieldValidator nele, certo?

Errado! Um RequiredFieldValidator apenas irá disparar se o campo NÃO estiver preenchido. O que queremos é que numa condição X em que um textbox esteja vazio, o validator execute, e em outra não.

Para isso podemos utilizar um CustomValidator e atribuir a propriedade de argumento de evento IsValid no evento ServerValidate para que seja True se as nossas condições forem obedecidas.

Porém (sempre tem um porém!) justamente quando você quer validar quando o  campo está vazio utilizando um CustomValidator o evento ServerValidate não dispara nem a pau, mesmo você chamando diretamente o método Validate() do mesmo. E você não pode usar um RequiredFieldValidator. O que você faz, ajoelha e chora?

Com exceção do RequiredFieldValidator, TODOS os demais validators não executam quando um textbox na propriedade ControlToValidate está vazio. Este é um comportamento padrão. Vamos dar uma olhada na caixa de propriedades de um CompareValidator e um CustomValidator:

Caixa de Propriedades de um CustomValidator x CompareValidator

Além das propriedades inerentes a cada tipo de Validator, temos uma propriedade curiosa no CustomValidator: ValidateEmptyText. Se colocarmos ela em True, o evento ServerValidate irá ser executado ao verificar a propriedade IsValid da página ou outra rotina de validação. Os outros tipos de validator não validam quando o texto está vazio. Com isso podemos testar, por exemplo, a obrigatoriedade de um campo em determinada condição em nosso sistema.

Dica fácil essa, né? Quando pesquisei sobre o assunto, vi uma sugestão em que era necessário derivar uma classe do “pai” dos validators!

Espero que esta dica seja de bom proveito :)