Neanche Lina Wertmuller faceva titoli lunghi come i miei... Comunque... In questi giorni sto realizzando dei web control utili per un progetto che sto seguendo dall'inizio del millennio a questa parte. Per snellire il lavoro mi sono creato dei composite control, ma nell'ultimo caso avevo riscontrato un problema. Banalmente: nel composite control avevo aggiunto un validator - nel dettaglio, un comparevalidator - che doveva far riferimento ad un webcontrol esterno al composite control. Con la normale assegnazione dell'ID del controllo da verificare ottenevo l'errore di controllo non trovato.
Con l'aiuto di Nostromo - che ringrazio - da questo post nel forum, si è scoperto che il problema è nel metodo CheckControlValidationProperty. Nel dettaglio cerca il controllo nel composite control corrente:
protected void CheckControlValidationProperty(string name, string propertyName)
{
Control control1 = this.NamingContainer.FindControl(name);
if (control1 == null)
{
throw new HttpException(HttpRuntime.FormatResourceString("Validator_control_not_found", name, propertyName, this.ID));
}
if (BaseValidator.GetValidationProperty(control1) == null)
{
throw new HttpException(HttpRuntime.FormatResourceString("Validator_bad_control_type", name, propertyName, this.ID));
}
}Per risolvere ho dovuto estendere la classe CompareValidator modificando quel metodo per fare in modo che il controllo lo cercasse nella pagina. Il risultato è il seguente:
public class myCompareValidatorControl:CompareValidator
{
void CheckControlValidationProperty(string name, string propertyName)
{
Control control1 = Page.FindControl(name);
if (control1 == null)
{
throw new HttpException("Validator_control_not_found");
}
if (BaseValidator.GetValidationProperty(control1) == null)
{
throw new HttpException("Validator_bad_control_type");
}
}
protected override bool EvaluateIsValid()
{
string text1 = GetControlValidationValue(base.ControlToValidate);
if (text1.Trim().Length == 0)
{
return true;
}
string text2 = string.Empty;
if (this.ControlToCompare.Length > 0)
{
text2 = GetControlValidationValue(this.ControlToCompare);
}
else
{
text2 = this.ValueToCompare;
}
return BaseCompareValidator.Compare(text1, text2, this.Operator, base.Type);
}
string GetControlValidationValue(string name)
{
Control control1 = Page.FindControl(name);
if (control1 == null)
{
return null;
}
PropertyDescriptor descriptor1 = GetValidationProperty(control1);
if (descriptor1 == null)
{
return null;
}
object obj1 = descriptor1.GetValue(control1);
if (obj1 is ListItem)
{
return ((ListItem) obj1).Value;
}
if (obj1 != null)
{
return obj1.ToString();
}
return string.Empty;
}
protected override bool ControlPropertiesValid()
{
if (this.ControlToCompare.Length > 0)
{
CheckControlValidationProperty(this.ControlToCompare, "ControlToCompare");
if (string.Compare(base.ControlToValidate, this.ControlToCompare, true, CultureInfo.InvariantCulture) == 0)
{
throw new Exception("Validator_bad_compare_control");
}
}
else if ((this.Operator != ValidationCompareOperator.DataTypeCheck) && !BaseCompareValidator.CanConvert(this.ValueToCompare, base.Type))
{
throw new Exception("Validator_value_bad_type");
}
return true;
}
}
Il problema è che il metodo di base CheckControlValidationProperty utilizza molte funzioni interne che ho dovuto riscrivere, tra cui GetControlValidationValue. Ma il risultato c'è, il tutto funziona. E vaiii!
Queste sì che cono soddisfazioni!
Daniele Bochicchio <Daniele_Bochicchio> ha scritto:
ma se ne facevi uno script e me lo mandavi no eh?![]()
Hai ragione. Ma ho pensato che era un po' particolare come argomento...
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.




Stampa
Download 
10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!

Andrea Zani wrote:
ma se ne facevi uno script e me lo mandavi no eh?
Continua »»» | Rispondi »»»