2013-07-18 28 views
5

Ho un'applicazione ASP.NET MVC-4 con questo campo di valuta:Come posso convalidare un campo di valuta?

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c}", ConvertEmptyStringToNull = true)] 
    [DataType(DataType.Currency)] 
    public decimal? Price { get; set; } 

Questa è la parte corrispondente a mio avviso:

@Html.EditorFor(model => model.Price) 
    @Html.ValidationMessageFor(model => model.Price) 

Se il prezzo è di 100 Euro il campo di testo in la visualizzazione mostra:

100,00 €

Questo è bello.

Ma io sto avendo problemi non appena provo a fare un postback. Il validatore si apre e dice che il campo del prezzo deve essere un numero.

posso risolvere solo in questo caso (1) a cancellare il simbolo € e (2) Sostituire il separatore decimale (sostituire virgola con un punto).

Se non c'è soluzione migliore, Credo che avrei potuto cambiare il DataFormatString = "{0: F2}" al fine di evitare il simbolo di valuta.

Ma come faccio a fare in modo che il validatore accetti la virgola come separatore decimale invece del punto (americano)?

Grazie per il vostro aiuto, ragazzi!

+1

Penso che sia necessario creare un raccoglitore modello personalizzato, controllare questo collegamento http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx – Overmachine

+0

@Overmachine: Grazie per il tuo commento. Ma non credo che ModelBinder risolverà il problema del validatore. In altre parole: desidero ancora la convalida del client e il validatore continuerà a fallire (con o senza ModelBinder), sbaglio? – Ingmar

+0

la validazione del client funzionerà ancora, il problema è quando si fa il post, sta inviando il simbolo della valuta. – Overmachine

risposta

1

Così, sono stato in grado di risolvere il mio problema con il plugin globalizzazione di jQuery da http://github.com/jquery/globalize.

ho aggiunti i seguenti file ai miei /scripts cartella:

  • /scripts/globalize.js
  • /scripts/cultures/globalize.cultures.js
  • /sctipts/culture/globalize.culture.de-DE.js

In BundleConfig.cs:

bundles.Add(new ScriptBundle("~/bundles/scripts/globalization").Include(
      "~/Scripts/globalize*", 
      "~/Scripts/cultures/globalize*")); 

In _Layout.cshtml:

@Scripts.Render("~/bundles/scripts/globalization") 

e nella sezione sceneggiatura di _Layout.cshtml:

$.validator.methods.number = function (value, element) { 
      return this.optional(element) || !isNaN(Globalize.parseFloat(value)); 
     } 
     $.validator.methods.range = function (value, element, param) { 
      return this.optional(element) || (Globalize.parseFloat(value) >= param[0] && Globalize.parseFloat(value) <= param[1]); 
     } 

Tuttavia, non ho potuto fare il simbolo di valuta lavoro con la validazione del client, quindi ho anche modificato l'annotazione dei dati come segue:

[DisplayFormat(ApplyFormatInEditMode = false, DataFormatString = "{0:c}", ConvertEmptyStringToNull = true)] 

Ma che è stato. Non sono necessarie altre modifiche Ora posso inserire valori come "1,49" o "18,77" e tutto viene memorizzato correttamente nel mio database.

Problemi correlati