J'ai une classe qui ressemble à ceci:sur mesure TextBox avec validateur intégré: validation côté serveur ne tirant
public class TextField : TextBox
{
public bool Required { get; set; }
RequiredFieldValidator _validator;
protected override void CreateChildControls()
{
base.CreateChildControls();
_validator = new RequiredFieldValidator();
_validator.ControlToValidate = this.ID;
if(Required)
Controls.Add(_validator);
}
public override void Render(HtmlTextWriter tw)
{
base.Render(tw);
if(Required)
_validator.RenderControl(tw);
}
}
Cela a travaillé pendant un certain temps dans une application interne où le javascript est toujours activé. J'ai récemment remarqué qu'une erreur javascript en amont peut empêcher les validateurs de se déclencher, donc la validation côté serveur devrait démarrer ... non? droite?
Ainsi, la propriété Page.IsValid renvoie toujours la valeur true (j'ai même essayé d'appeler explicitement Page.Validate() before-hand). Après quelques recherches, j'ai trouvé que la méthode init de validator devrait ajouter le validateur à la page, mais en raison de la façon dont je le construis, je ne pense pas que cela arrive jamais. Ainsi, la validation côté client fonctionne, mais pas la validation côté serveur.
J'ai essayé ceci:
protected override OnInit()
{
base.OnInit();
Page.Validators.Add(_validator); // <-- validator is null here
}
Mais bien sûr, le validateur est nul ici (et parfois il n'est pas nécessaire donc il ne doit pas être ajouté) ... mais OnInit() est très tôt pour moi de prendre ces décisions (la propriété Required n'aura pas été chargée à partir de ViewState par exemple).
Des idées?
En fait, ce qui a fonctionné moi en utilisant votre exemple comme un guide est d'appeler simplement EnsureChildControls() avant l'appel de base.OnInit (e). Merci! –