944 messaggi dal 11 febbraio 2013
In un progetto MVC partendo da zero (per imparare)
ho la necessità di consentire all'utente di compilare un form con campi valuta e nello specifico euro.

Vorrei consentire l'inserimento di valori numerici secondo la convenzione standard ovvero 125,23 per esempio
(con il separatore dei decimali con la virgola)

Ho due problemi:
-valori come 125,23 non vengono riconosciuti come validi
- valori come 125,00 nemmeno

ho provato ha creare un modello ma non va

 public class DecimalModelBinder : IModelBinder
    {
       
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
            if (value != null)
            {
                Decimal mydecimal;

                var isDecimal = Decimal.TryParse(value.AttemptedValue, NumberStyles.Currency, Thread.CurrentThread.CurrentUICulture, out mydecimal);

                if (!isDecimal)
                {
                    bindingContext.ModelState.AddModelError(bindingContext.ModelName, "valore  numerico non valido");
                    return 0;
                }

                return mydecimal;
            }
            else return null;
        }

    }

 protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
           
            ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
            ModelBinders.Binders.Add(typeof(decimal?), new DecimalModelBinder());
        }


Ora sono sicuro che qualcuno può aiutarmi e farmi capire dove sbaglio
grazie come sempre
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, se metti un breakpoint nel corpo di BindModel l'esecuzione ti si interrompe in quel punto?
Se sì, vuol dire che il tuo model binder è stato registrato correttamente e quindi bisogna andare a capire come mai non ti sta convertendo il numero decimale.

In particolare, prova a mettere un breakpoint nei pressi di questa riga:

if (!isDecimal)


isDecimal è true o false?
Se è false vuol dire che decimal.TryParse ha fallito, forse a causa di Thread.CurrentThread.CurrentUICulture, che non viene impostata sull'italiano.

Fammi sapere cosa valgono value.AttemptedValue, isDecimal e CurrentUICulture, poi vediamo come continuare.

ciao,
Moreno

Enjoy learning and just keep making
944 messaggi dal 11 febbraio 2013
Ciao Moreno,
grazie per la risposta

L'esecuzione nel Bind si interrompe solamente se digito un numero come 500 o 500.25 (che però diventa 50025) !
Se provo 500,25 il debug non parte nemmeno (non avviene nessun submit)
Modificato da jjchuck il 05 giugno 2017 18.50 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


il debug non parte nemmeno

Ok, allora magari c'è un errore lato client, ad esempio nella validazione javascript del dato. Apri gli strumenti di sviluppo del browser (tasto F12) e vai nella tab "Console" a vedere se appaiono errori javascript.

ciao,
Moreno

Enjoy learning and just keep making
944 messaggi dal 11 febbraio 2013
No nessun errore a console
11.886 messaggi dal 09 febbraio 2002
Contributi
Ok, comunque, se il submit non avviene penso che nella tua pagina ci sia del javascript che lo inibisce quando il valore digitato nella casella non è interpretabile come un numero.

Per esempio, la funzione javascript isNaN (is not a number) restituisce true in presenza di "125,23".
isNaN("125,23")


Hai del codice di validazione personalizzato?

ciao,
Moreno

Enjoy learning and just keep making
944 messaggi dal 11 febbraio 2013
Javascript per ora solo questo:
 <script>
        $(document).ready(function () {
            
            //POPOVER NOTE
            $('[data-toggle="popover"]').each(function (index) {
                var that = $(this);
                $(this).popover({
                    html: true,
                    title: 'Note',
                    content: function () {
                        return $('#' + $(this).attr('id') + ' + .popoverContent').html();
                    }
                });
            });
            $('[data-toggle="popover"]').on('hide.bs.popover', function () {
                $('#' + $(this).attr('id') + ' + .popoverContent textarea').html($('#' + $(this).attr('aria-describedby') + ' .popover-content textarea').val());
            });
            
           
            //MAIUSCOLO
            $("#mySubmitButton").click(function () {
              
                $("#RagioneSociale,#Citta,#Provincia").val(function () {
                    return this.value.toUpperCase();
                });
            });

            //TOTALE ORDINI
            function sommaLinee() {
                var totale =
                    Number($("#Linea1").val()) +
                    Number($("#Linea2").val()) +
                    Number($("#Linea3").val());

                if (!isNaN(totale) && totale != undefined)
                $("#Totale").val(totale);
            };

            //EVENTI SOMMA
            $("#Linea1, #Linea2, #Linea3).on("blur keypress keyup", function () {
                sommaLinee();
            });
        });

    </script>


metadati:
[MetadataType(typeof(Rapportino_MetaData))] 
    public partial class Rapportino
    {
      
    }

    internal class Rapportino_MetaData
    {
        [DisplayFormat(DataFormatString = "{0:d}")]
        [Required]
        public DateTime Data;

        [Display(Name = "New")]
        public Nullable<bool> NuovoCliente;

        [Display(Name = "RagSoc")]
        [Required]
        public string RagioneSociale;

        [Display(Name = "Città")]
        [Required]
        public string Citta;

        [Display(Name = "Prov")]
        [Required]
        public string Provincia;

        [DisplayFormat(DataFormatString = "{0:C2}")]
        [Range(1, 100000)]
        [Display(Name = "L1")]
        public Nullable<Decimal> Linea1;

        ...
    }

Modificato da jjchuck il 06 giugno 2017 09.18 -

_Layout page:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - Report</title>
    @Styles.Render("~/Content/css")
    @Styles.Render("~/Content/themes/base/css")
    @Scripts.Render("~/bundles/modernizr")
    
  
</head>
<body>
    <!--LOADING MESSAGE-->
    <div id="modal">
        <div id="modal-content">
            <img src="~/Images/Loading.gif" style="width:97px;height:97px;border: solid 3px blue;border-radius:3px;" />
        </div>
    </div>

    <div class="navbar navbar-inverse navbar-fixed-top">
     ...
    </div>

    <div class="container body-content">

        @RenderBody()
       
    </div>

    <footer class="navbar-fixed-bottom navbar-inverse text-center">
        ...
    </footer>
    
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/jqueryui")
    @Scripts.Render("~/bundles/jqueryval") @*aggiungo per jquery.unobtrusive-ajax  *@
    @Scripts.Render("~/bundles/bootstrap")

    @RenderSection("scripts",required:false)

    <script type="text/javascript">
        var spinnerVisible = false;
        function showProgress() {
            if (!spinnerVisible) {
                $("#modal").fadeIn("fast");
                spinnerVisible = true;
            }
        };
        function hideProgress() {  
            if (spinnerVisible) {
                var spinner = $("#modal");
                spinner.stop();
                spinner.fadeOut("slow");
                spinnerVisible = false;
            }
        };
    </script>
</body>
</html>

Modificato da jjchuck il 06 giugno 2017 09.32 -
944 messaggi dal 11 febbraio 2013
Ciao Moreno

Ho riprodotto il problema in una piccola soluzione e ho notato che commentando questa libreria tutto funziona
Sia la modifica che l'inserimento.

@*@Scripts.Render("~/bundles/jqueryval")*@

Sono sorpreso perchè con la procedura guidata inserendo un controller con entityframework che genera tutto in automatico viene proprio referenziata la libreria sopra in create.cshtml e edit.cshtml

Ne posso fare a meno ?

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.