Sono sempre più entusiasta di questo Framework (e di tutti i suoi fratelli naturalmente). Ieri mi sono trovato a combattere per effettuare validazione dei campi lato client.
E' vero, esistono gli attributi di validazioni da mettere sulle property dei model per abilitare l'attivazione in maniera automatica (direi geniale), ma il mio domain è condiviso e non volevo marcare con attributi le classi del mio Domain e dover portare quindi anche negli altri progetti le dll di monorail solo per gli attributi. Certo una possibile soluzione era quella di creare dei wrapper per popolare gli oggetti di domain, ma mi sono convinto e ho provato a "giocare" con la validazione lato client.
Per chi fosse interessato, Monorail per la validazione si basa su questo framework javascript (prototype + validation) e la libreria validation.js è stata inclusa nel formhelper.js.
Dunque, la cosa principale da fare è istruire il framework su cosa vada validato nel nostro caso una form con id='form1':
if (!window.prototypeValidators) prototypeValidators = $A([]);
var validator = new Validation(
'form1',
{onSubmit:true,
focusOnError:true,
stopOnFirst:false,
immediate:true,
useTitles:true
});
prototypeValidators['form1'] = validator;
La validazione è tutta basata sui className degli oggetti del dom. Le validazioni più usate sono già presenti ("required","validate-numbers" ...) e naturalmente è possibile scriversi i propri validatori.
Valdiare ad esempio una textbox e istruire la pagina per accettare solamente textbox non vuote è disarmante da quanto risulta semplice:
NVelocity:
$Form.TextField("candidato.Nome", "%{class='required'}")
Html
<input type="text" class="required" value="" id="candidato_name" name="candidato.name"/>
Per poter invece aggiungere un validatore custom ci sono due strade percorribili:
1) Aggiungere un validatore alla volta, definendo il nome del validatore (che sarà utilizzato come class del campo da validare), il messaggio di errore e le options
2) Aggiungere una collection di validatori.
Personalmente ho preferito percorrere la seconda strada, ed ecco come è possibile aggiungere validatori custom:
Validation.AddAllThese([
['validate-min6',
'il campo deve contenere almeno 6 caratteri',
{minLength:6}],
['validate-regex',
'il campo non ha un formato valido',
{pattern: /!\d{5}/}],
['validate-custom',
'validatore custom',
function(v,elm) {
// v è il valore del campo che si sta validando
// elm è l'elemento del dom equivalente a $('{elemento')
return true //(se la validazione va a buon fine)
return false // la validazione non è andata a buon fine
}
]);
Anche in questo caso ho avuto qualche problema con la validazione custom in quanto ci ho messo un po' di tempo a capire come utilizzare la "function (v,elm)" mentre era abbastanza chiaro la "function (v)".