Posto questi due metodi perchè ho trovato divertente riuscire a rendere il codice così striminzito grazie a C# 3.0 e alla ricorsione:
1: private void ValidateByGroup(string validationGroup) {
2: List<BaseValidator> validators = new List<BaseValidator>(from validator in FindControlsByType<BaseValidator>(this)
3: where validator.ValidationGroup == validationGroup select validator);
4: validators.ForEach(validator => validator.Validate());
5: }
6:
7: private static IList<T> FindControlsByType<T>(Control root) where T: Control {
8: List<T> controls = new List<T>();
9: foreach (Control child in root.Controls) {
10: Type type = child.GetType().BaseType;
11: while(type != typeof(object)){
12: if (type == typeof(T))
13: {
14: controls.Add((T)child);
15: break;
16: }
17: type = type.BaseType;
18: }
19:
20: if (child.HasControls())
21: controls.AddRange(FindControl<T>(child));
22: }
23: return controls;
24: }
Perchè funzioni è necessario disabilitare il controllo lato client impostando a False la proprietà EnableClientScript dei validator. Per rendere comunque la pagina reattiva sarebbe bene sfruttare AJAX perchè in questo modo il controllo verrà fatto solo lato server.
Matteo Migliore.