Antonio "tdj"

(C'è sempre un modo migliore)
posts - 312, comments - 268, trackbacks - 17

My Links

News





Tag Cloud

Article Categories

Archives

Post Categories

Image Galleries

Articoli

Blogs

Controlli WinForm free

Guide

Siti vari

Sviluppo

jQuery Validation e impostazioni multilingua con ASP.NET MVC

Realizzare applicazioni multilingua con asp.net MVC è abbastanza semplice grazie al namespace System.Globalization che offre decine di classi per questo scopo (senza dimenticare i file .resx).
Qualche problema, però, potrebbe sorgere quando bisogna gestire numeri e date lato client.
Di default, un progetto ASP.NET MVC utilizza la libreria jQuery Validation per gestire le validazioni lato client di numeri e date e il suo funzionamento dovrebbe tenere conto delle impostazioni internazionali. Dico "dovrebbe" perchè purtroppo non funziona proprio così.

Se, infatti , proviamo a definire una proprietà di tipo Decimal (o Double) nel modello, e proviamo a scriverci dentro un valore decimale, otteniamo un errore come questo:


Il motivo è molto semplice: jquery validation usa sempre le impostazioni americane per validare un numero decimale, considerando, cioè, il punto "." come separatore dei decimali.

La prima soluzione potrebbe essere quella di sovrascrivere il metodo di validazione incriminato ma in un contesto multilingua, non reggerebbe. Fortunatamente esiste una fantastica libreria javascript chiamata Globalize (che trovate anche su NuGet) che contiene le definizioni di tutte le culture permettendo la corretta interpretazione di numeri e date.

Si, ok, ma come posso integrare Globalize con jquery validation?

Tempo fa Scott Hanselman affrontò questo problema proponendo anche una soluzione piuttosto semplice, cioè fare l'override dei metodi di validazione number come nel codice javascript seguente:

$.validator.methods.number = function(value, element) {
   
if (Globalize.parseFloat(value)) {
        
return true;
    }
   
return false;
};

In pratica si utilizza il metodo Globalize.parseFloat() per intepretare i numeri decimali inbase alla cultura corrente. Per i più pigri, invece, da qualche tempo è disponibile un package NuGet chiamato jquery.validation.globalize che è sufficiente includere nelle view per applicare automaticamente l'override.
Queste sono le soluzioni che si trovano in giro per la rete.

Quindi è tutto risolto?

Beh non proprio perché il metodo parseFloat() presenta un picolo inconveniente.
Consideriamo un input di questo tipo:

10.5

per la cultura italiana, questo numero non è valido ma Globalize.parseFloat() restituisce il valore 105 che, essendo un valore numerico, rende vera la validazione vista in precedenza.
La soluzione che ho adottato io è di riprendere la regular expression usata da jQuery Validation basandomi, però, sulla cultura corrente impostata con Globalize:

$.validator.methods.number = function(value, element) {
  
var currentCulture = Globalize.findClosestCulture(Globalize.culture().name);
   
var _decimalSeparator = currentCulture.numberFormat["."],
        _digitsSepator = currentCulture.numberFormat[
","];

   
if (_decimalSeparator == ".") _decimalSeparator = "\\.";
   
if (_digitsSepator == ".") _digitsSepator = "\\.";

   
var reg = new RegExp("^-?(?:\\d+|\\d{1,3}(?:" + _digitsSepator + "\\d{3})+)?(?:" + _decimalSeparator + "\\d+)?$");

   
return this.optional(element) || reg.test(value);
};

In pratica recupero le impostazioni dei numeri decimali con Globalize e li applico alla regex che valida il numero in input.
Quindi, ritornando al nostro esempio iniziale, il valore 10,5 sarà accettato mentre 10.5 no:

Se qualcuno ha una soluzione alternativa, è il benvenuto :)

Print | posted on giovedì 17 ottobre 2013 09:32 | Filed Under [ Asp.net jquery Asp.net MVC ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET