Imprecisione nei CompareValidator?

Discutevo l'altro giorno al workshop con Mrkino, Adrian e Gianluca di questa faccenda.
Io personalmente utilizzo molto spesso i CompareValidator con  Operator="DataTypeCheck" per validare l'input di un utente e controllare che sia un intero o un double. L'unico problema è che questo controllo controlla (scusate l'allitterazione: di domenica il mio dizionario si dimezza :)) solamente il fatto che il numero inserito sia un numero intero oppure reale (da qui il mio storcere il naso sul fatto che invece che Type="Real" lui accetti Type="Double"). Questo si traduce nel fatto che lo sviluppatore poco attento potrebbe basarsi solamente su un CompareValidator per validare un input, e quindi fare una candida Convert.ToInt32 che ovviamente fallirà miseramente nel caso l'utente inserisca un valore piu basso di  -2,147,483,648  o più alto di 2,147,483,648. E qui iniziano i problemi: questo vuol dire che in realtà il CompareValidator serve soltanto a controllare che l'input sia un numero, in virgola mobile o no, e che comunque alla base di qualsiasi convert su un input inserito dall'utente non mi posso basare su quello che mi esce dal CompareValidator. Una validazione sulla lunghezza non è la soluzione, in quanto anche se il limite fosse 9,999,999,999, comunque ci sarebbe il segno "-" a stravolgere le cose.
In conclusione, quindi, io sono costretto o a farmi un bel CustomValidator che mi controlli che il numero, oltre ad essere formalmente corretto, non ecceda un tot (uno per gli int32 ed uno per i double) oppure a farmi un controllo lato server, con tutti i dispendi che ne conseguono. Da qui ne deriva che secondo me il DataTypeCheck è praticamente inutile su Interi e su Double (non l'ho mai provato con operatore DateTime in quanto di solito utilizzo sempre Calendar o CustomControl che espongono DateTime).
Voi che ne pensate? :)

Print | posted on domenica 10 aprile 2005 14.23

Comments on this post

# re: Imprecisione nei CompareValidator?

Requesting Gravatar...
Per un Int32 potresti utilizzare un RangeValidator con:
Type="Integer" MinimumValue="-2147483648" MaximumValue="2147483647"
Left by Adrian Florea on apr 10, 2005 3.18

# re: Imprecisione nei CompareValidator?

Requesting Gravatar...
Effettivamente non avevo pensato al range validator che è sicuramente meglio di un custom, e per i miei scopi funziona perfettamente. Vedo anche che entrambe le validazioni chiamano la stessa funzione javascript ValidatorCompare(), quindi non c'è neanche una differenza in termini di controlli.
Ma a questo punto mi sfugge quando si dovrebbe utilizzare il compare validator con DataTypeCheck. L'unico utilizzo che mi viene in mente è per validare un numero che poi, da codice, verrà comunque trattato come stringa, ma non afferro l'utilizzo.
Left by Alessandro Ghizzardi on apr 10, 2005 4.29

# re: Imprecisione nei CompareValidator?

Requesting Gravatar...
Ho fatto un piccolo test per vedere se la colpa è del metodo BaseCompareValidator.Convert e sembra che *il bug* stia lì:

// foo.cs
// csc /r:C:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.Web.dll /nowarn:162 foo.cs

using System;
using System.Web.UI.WebControls;

class TestConvert: BaseCompareValidator
{
protected override bool EvaluateIsValid()
{
// per questo test non ci interessa questo metodo
// implementazione dovuta solo al fatto che BaseCompareValidator è abstract
throw new NotImplementedException(); // warning CS0162
return false;
}

public new static bool Convert(string text, ValidationDataType type, out object value)
{
return BaseCompareValidator.Convert(text, type, out value);
}
}

class Foo
{
static void Main()
{
long value = (long)int.MaxValue + 1;
object valueObj = (object)value;

// stampa False
Console.WriteLine(TestConvert.Convert(value.ToString(), ValidationDataType.Integer, out valueObj));
}

}
Left by Adrian Florea on apr 10, 2005 6.50

# re: Imprecisione nei CompareValidator?

Requesting Gravatar...
Scusa, volevo dire "*il bug* NON stia lì"
Left by Adrian Florea on apr 10, 2005 6.53

# re: Imprecisione nei CompareValidator?

Requesting Gravatar...
Non avevo visto il metodo pubblico BaseCompareValidator.CanConvert... Con questo metodo il test diventa più semplice perché non c'è più bisogno di una classe concreta:

// foo.cs
// csc /r:C:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.Web.dll foo.cs

using System;
using System.Web.UI.WebControls;

class Foo
{
static void Main()
{
long value = (long)int.MaxValue + 1;

// stampa False
Console.WriteLine(BaseCompareValidator.CanConvert(value.ToString(), ValidationDataType.Integer));
}
}
Left by Adrian Florea on apr 10, 2005 7.02

# re: Imprecisione nei CompareValidator?

Requesting Gravatar...
Ok, allora se il BaseCompareValidator si comporta così, vuol dire che il "bug" è nel metodo Javascript ValidatorConvert, che si limita a fare un matching con una regular expression che accetta il - o il + davanti ad una serie di numeri, e poi a fare un parseInt della stringa passata (il parseInt di javascript se ne frega della lunghezza).
Insomma, è solo un controllo formale, invece di quello che fa il BaseCompareValidator. Sbaglio a credere che questo comportamento sia un pò strano?
Left by Alessandro Ghizzardi on apr 11, 2005 8.21

Your comment:

 (will show your gravatar)
 
Please add 7 and 4 and type the answer here: