Salut à tous,
Je bloque sur un PB qui me rend fou !!
Je créé un CustomControl qui doit hérité de TextBox et et implémenter l'interface IValidator.
Ce controle contient un CustomValidator en interne (private) et quelques propriétés plublic pour paramétrer ce validator.
Mon problème se situe au niveau de la validation serveur. En effet, celle-ci ne semble jamais avoir lieu !! je ne passe pas dans les méthodes créées pour la gestion de l'événément ServerValidate.
Pourtant, la validation client se fait correctement.
Juste une précision avant de vous montrer mon code. Je créé un 1er controle (MyTextBox) tout simple (aucune validation). Puis plusieurs autres contrôles qui héritent de MyTextBox, chacun spécialisé (MyIntergerTextBox, MyDecimalTextBox, ...). Ensuite, j'ai une autre couche de contrôles qui héritent d'un des contrôles précédent pour le spécialiser encore un peu plus (MyIntegerTextBox2 : MyIntegerTextBox, .....)
Voici en gros le code de ma classe MyTextBox :
Puis le code d'une classe spécialisée (MyDecimalTextBox) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 public class MyTextBox : TextBox, IValidator { private bool _enableClientScript = true; private string _errorMessage; private string _validatorText; private string _validationFunction; private CustomValidator _validator; public event ServerValidateEventHandler ServerValidate; public bool EnableClientScript { get { return _enableClientScript; } set { _enableClientScript = value; } } public string ValidatorText { get { return _validatorText; } set { _validatorText = value; } } protected string ClientValidationFunction { get { return _validationFunction; } set { _validationFunction = value; } } public string ErrorMessage { get { return _errorMessage; } set { _errorMessage = value; } } public bool IsValid { get { return _validator.IsValid; } set { _validator.IsValid = value; } } public virtual void Validate() { _validator.Validate(); } public virtual void OnServerValidate(ServerValidateEventArgs args) { if (ServerValidate != null) ServerValidate(this, args); } public CNPTextBox() : base() { _validator = new CustomValidator(); } protected override void CreateChildControls() { _validator.ServerValidate += new ServerValidateEventHandler(_validator_ServerValidate); _validator.ID = this.ID + "_validator"; _validator.ControlToValidate = this.ID; _validator.ErrorMessage = ErrorMessage; _validator.EnableClientScript = EnableClientScript; _validator.ValidationGroup = ValidationGroup; _validator.Text = ValidatorText; _validator.ClientValidationFunction = ClientValidationFunction; this.Controls.Add(_validator); base.CreateChildControls(); } void _validator_ServerValidate(object source, ServerValidateEventArgs args) { OnServerValidate(args); } protected override void OnPreRender(EventArgs e) { ClientScriptManager cs = Page.ClientScript; cs.RegisterClientScriptResource(typeof(MyTextBox), "MyTextBox.js"); base.OnPreRender(e); } protected override void Render(HtmlTextWriter writer) { base.Render(writer); _validator.RenderControl(writer); } }
Remarque : En commentaire dans la classe ci-dessus, une autre "méthode" pour la validation server, mais elle ne marche pas mieux
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 public class MyDecimalTextBox : MyTextBox { public MyDecimalTextBox () : base() { //base.ServerValidate += new ServerValidateEventHandler(MyDecimalTextBox_ServerValidate); } public override void OnServerValidate(ServerValidateEventArgs args) { base.OnServerValidate(args); double dt; string strDouble = args.Value.Replace(",", "."); strDouble = strDouble.Replace(" ", ""); bool ret = false; if (Double.TryParse(strDouble, out dt)) { ret = true; this.Text = dt.ToString("n2"); } args.IsValid = ret; } //void MyDecimalTextBox_ServerValidate(object source, ServerValidateEventArgs args) //{ // double dt; // string strDouble = args.Value.Replace(",", "."); // strDouble = strDouble.Replace(" ", ""); // bool ret = false; // if (Double.TryParse(strDouble, out dt)) // { // ret = true; // this.Text = dt.ToString("n2"); // } // args.IsValid = ret; //} protected override void OnInit(EventArgs e) { base.ClientValidationFunction = "CheckDouble"; base.OnInit(e); } public override void RenderBeginTag(HtmlTextWriter writer) { writer.AddAttribute("onfocus", "this.value = MoneyUnformat(this.value)"); base.RenderBeginTag(writer); } }
Le code de la classe encore au-dessus :
Enfin me code de l'aspx :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public class MyDecimalTextBox2 : MyDecimalTextBox { public MyDecimalTextBox2() : base() { ValidatorText = "*"; } }
Je précise qu'en activant la validation client (par défaut), pas de PB.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <pum:MyDecimalTextBox2 ID="MyDecimalTextBox2_1" runat="server" ErrorMessage="Format incorrect"></pum:MyDecimalTextBox2>
Mais il n'y a pas de validation serveur. Et ce même si je désactive la validation client.
Qu'est-ce qu'il me manque ???
Partager