9 messaggi dal 28 dicembre 2020
Buona sera a tutti,

sto muovendo i primi passi con il framework in oggetto e con MVC (versione 5.0.403) tramite un corso on-line che sto seguendo;
nel corso si va via via costruendo un portale per la gestione di video corsi e sto implementando la form per la modifica dei dati.
Nella View ho introdotto diverse tipologie di controlli di tipo input tra cui <input type='number' step='Any' ........ > che dovrebbe mostrare
il prezzo del corso ma ho dei comportamenti diversi a seconda del browser che utilizzo.
di seguito riporto un frammento di codice della View; la view è tipizzata con un oggetto che esponde le proprietà che voglio mostrare nella pagina di modifica

<div class="form-group">    
        <label asp-for="oFullPrice"></label>
        <div class="input-group">
            <select class="form-control form-control-lg" asp-items="@Html.GetEnumSelectList<Currency>()" asp-for="oFullPrice.Valuta"> </select>
            <input type="Number" step="Any" asp-for="oFullPrice.Importo" class="form-control form-control-lg">
         </div>
         <span asp-validation-for="oFullPrice"></span>
 </div>


dove 'oFullPrice.Importo' è una proprietà di tipo Decimal (e sto lavorando su base dati Sql Server 2019 , il campo è un decimal(27,9)).

il problema che riscontro è che visualizzando il form con Chrome la casella mi appare vuota anche se analizzando il codice HTML generato, tarmite gli strumenti di sviluppo del browser, la proprietà 'Value' è popolata.

<input type="Number" step="Any" class="form-control form-control-lg" data-val="true" data-val-number="The field Importo must be a number." data-val-required="The Importo field is required." id="oFullPrice_Importo" name="oFullPrice.Importo" value="50,00">


Ed inoltre quando eseguo il commit sembra che non venga tenuto conto del separatore decimale, ad esempio il prezzo 39,99 viene salvato a database come 3999,00.

Se utilizzo FireFox ho "solo" quest'ultimo problema descritto mentre il valore è visibile nel controllo.

In ultimo, se utilizzo un controllo di tipo 'Text' tutto funziona correttamente .... aiuto!!!

<input type="text" asp-for="oCurrentPrice.Importo" class="form-control form-control-lg">



Grazie a chi vorrà illuminarmi

Marco
Ciao!
Credo che il problema sia il fatto che javascript e html usino il punto ( .) e non la virgola per identificare il numero decimale nell'INPUT come type NUMBER
Se nell'input scrivi 33,99 invece di 33.99 il browser nel metodo post invierà 3399 come numero intero.
prova ad utilizzare il punto e fammi sapere!

Maurizio
9 messaggi dal 28 dicembre 2020
Maury07 ha scritto:
Ciao!
Credo che il problema sia il fatto che javascript e html usino il punto ( .) e non la virgola per identificare il numero decimale nell'INPUT come type NUMBER
Se nell'input scrivi 33,99 invece di 33.99 il browser nel metodo post invierà 3399 come numero intero.
prova ad utilizzare il punto e fammi sapere!

Maurizio


Ciao Maurizio,
Grazie per il suggerimento! appena rientro a casa proverò! l'unica cosa che sto pensando è che leggo i dati con una classica
query 'SELECT co_currentprice_importo, ....... FROM corsi WHERE ......' e poi ho fatto un cast quando ho popolato le proprietà dell'oggetto con cui ho tipizzato la view; ho fatto semplicemente un Convert.ToDecimal(<campo>); quindi non ho indicato in esplicito il separatore decimale...
Farò qualche prova poi ti aggiorno! grazie per il supporto!

Marco
9 messaggi dal 28 dicembre 2020
Buona sera,
ho provato ad inserire il valore nel campo input utilizzando il punto come separatore decimale ma non risolvo; ho lo stesso risultato sia che utilizzi il punto che la virgola come separatore decimale.
Ho provato anche a creare delle proprietà di tipo diverso per fare dei test

        public decimal prova { get; set; }
        public double prova2 { get; set; }
        public float prova3 { get; set; }



   
<div class="form-group">
                    <input type="number" asp-for="prova" step="Any" title="1">
                    <input type="number" asp-for="prova2" step="Any" title="2">
                    <input type="number" asp-for="prova3" step="Any" title="3">
</div>


ma in ogni caso all'action del controller arrivano in modo errato: sia che scriva 10,99 o 10.99 arriva 1099; non riesco a capire come intervenire...
Grazie per aver condiviso la prova.. posso chiederti se posti il codice del controller?
9 messaggi dal 28 dicembre 2020
Maury07 ha scritto:
Grazie per aver condiviso la prova.. posso chiederti se posti il codice del controller?


Certo! eccolo di seguito

        [HttpPost]
        public async Task<IActionResult> Edit(CorsiEditInputModel inputModel) 
        {            
            if (ModelState.IsValid)
            {
                try
                {
                    CorsoDettagliViewModel corso = await corsiService.EditDataCorso(inputModel);
                    return RedirectToAction(nameof(Details), new { id = inputModel.id});    
                }
                catch (CourseTitleUnavailableException)
                {
                    ModelState.AddModelError(nameof(CorsoDettagliViewModel.strTitolo), "Questo titolo già esiste");
                }

            }
            ViewData["Title"] = "Modifica corso";
            return View(inputModel);
        }



Grazie a te per il supporto

Marco
Ciao!
ho fatto delle prove e credo sia un problema della global culture.
Prova ad aggiungere il codice seguente nella classe startup , nel metodo Configure


 app.Use(async (context, next) =>
            {
                var currentThreadCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
                currentThreadCulture.NumberFormat = NumberFormatInfo.InvariantInfo;

                Thread.CurrentThread.CurrentCulture = currentThreadCulture;
                Thread.CurrentThread.CurrentUICulture = currentThreadCulture;

                await next();
            });
            


sostanzialmente forza nella global culture corrente di usare come formato dei numeri il valore "InvariantInfo"
fammi sapere se con questo "workaround" funziona
grazie!
Maurizio
9 messaggi dal 28 dicembre 2020
Maury07 ha scritto:
Ciao!
ho fatto delle prove e credo sia un problema della global culture.
Prova ad aggiungere il codice seguente nella classe startup , nel metodo Configure


 app.Use(async (context, next) =>
            {
                var currentThreadCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
                currentThreadCulture.NumberFormat = NumberFormatInfo.InvariantInfo;

                Thread.CurrentThread.CurrentCulture = currentThreadCulture;
                Thread.CurrentThread.CurrentUICulture = currentThreadCulture;

                await next();
            });
            


sostanzialmente forza nella global culture corrente di usare come formato dei numeri il valore "InvariantInfo"
fammi sapere se con questo "workaround" funziona
grazie!
Maurizio



Ciao Maurizio, ti confermo che funziona! approfondirò l'argomento per capire meglio.
Grazie mille per il tempo che mi hai dedicato!

Marco
Modificato da EventHorizon il 10 febbraio 2022 18:36 -

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.