簡體   English   中英

asp.net core 2.0綁定帶小數值的模型

[英]asp.net core 2.0 bind model with decimal value

我一直在尋找這個案例的解決方案幾個小時,我找不到任何有用的東西。

這里我們使用逗號作為小數分隔符,當我發送一個像“15,50”這樣的值時,在我的控制器中我得到模型的值為“1550”,只有發送“15.50”才有意義。

我討論了以下主題,但沒有任何效果。

在Asp.net Core中設置CultureInfo有一個。 作為CurrencyDecimalSeparator而不是,

Aspnet核心十進制綁定不適用於非英語文化

我使用$form.serializeArray()發送帶有ajax的表單,如下所示:

function getFormData(xform) {
    var $form = $('#' + xform);
    var unindexed_array = $form.serializeArray();
    var indexed_array = {};

    $.map(unindexed_array, function (n, i) {
        indexed_array[n['name']] = n['value'];
    });    
    return indexed_array;
}

發送:

function PostFormAjax(controller, metodo, params, redir, divacao, reloadgrid) {

    if (params != null) {
        var formData = new FormData();

        var json = $.parseJSON(JSON.stringify(params));
        $(json).each(function (i, val) {
            $.each(val, function (k, v) {
                console.log(k + " : " + v);
                formData.append(k, v);
            });
        });
    }

    $.ajax({
        url: '/' + controller + '/' + metodo,
        data: JSON.stringify(params),
        contentType: 'application/json',
        type: 'POST',
        success: function (data) {
            AjaxFim(metodo, data, redir, divacao, reloadgrid);
        }
    });
}

我的控制器:

    [HttpPost]
    public IActionResult GravaProduto([FromBody] Produtos produto)
    {
        if (ModelState.IsValid)
        {
         //produto.Valorcusto is 1550 and not 15,50 as it was posted
         //produto.Valorvenda is 1550 and not 15,50 as it was posted
        }
    }

我的Model.cs

public partial class Produtos
{
    public int Cod { get; set; }
    public string Descricao { get; set; }
    public decimal Valorcusto { get; set; }
    public decimal Valorvenda { get; set; }
}

我試圖在formData.append(k, v.replace(',', '.'));進行替換formData.append(k, v.replace(',', '.')); 並且也不起作用,我也不知道哪個字段是小數。

我需要做什么? 因為我迷路了,應該更簡單的事情變得更加復雜。

在找到解決方案之前我一直努力工作的是:

根據我的區域設置戴口罩:

$('.stValor').mask("#.###.##0,00", { reverse: true });

在發布表單之前,我切換到可接受的格式:

$('#fCadAltProd').validator().on('submit', function (e) {
    if (e.isDefaultPrevented()) {
    } else {
        e.preventDefault();
        $('.stValor').mask("#,###,##0.00", { reverse: true });
        //Ajax post here
    }
});

這里我們使用逗號作為小數分隔符,當我發送一個像“15,50”這樣的值時,在我的控制器中我得到模型的值為“1550”,只有發送“15.50”才有意義。

使用挪威文化創建自定義模型綁定器,因為挪威也使用逗號小數點分隔符。 您可能還想指定某些允許的多個數字樣式

這是一個仍然需要進行錯誤處理的方法。 它提供了基本的想法,你可以從這里開始構建它。 我會做什么從內置的DecimalModelBinder復制大部分邏輯。

using System.Globalization;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.ModelBinding.Binders;
using Microsoft.Extensions.Logging;

namespace AspNetCorePlayground.Models
{
    public class MyFirstModelBinder : IModelBinder
    {
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            var valueProviderResult = bindingContext
                .ValueProvider
                .GetValue(bindingContext.ModelName);

            var cultureInfo = new CultureInfo("no"); // Norwegian

            decimal.TryParse(
                valueProviderResult.FirstValue,
                // add more NumberStyles as necessary
                NumberStyles.AllowDecimalPoint, 
                cultureInfo,
                out var model);

            bindingContext
                .ModelState
                .SetModelValue(bindingContext.ModelName, valueProviderResult);

            bindingContext.Result = ModelBindingResult.Success(model);    
            return Task.CompletedTask;
        }
    }
}

然后像這樣裝飾你的類:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding.Binders;

namespace AspNetCorePlayground.Models
{
    public class MyFirstModelBinderTest
    {
        [ModelBinder(BinderType = typeof(MyFirstModelBinder))]
        public decimal SomeDecimal { get; set; }
    }
}

我在控制器上測試了它:

[HttpGet("test")]
public IActionResult TestMyFirstModelBinder(MyFirstModelBinderTest model)
{
    return Json(model);
}

這是結果:

在此輸入圖像描述

使用此插件jquery.serializeToJSON並將getFormData()函數更改為

function getFormData(xform) {
    var $form = $('#' + xform);
    var obj = $form.serializeToJSON({
        parseFloat: {
            condition: ".stValor,.stQnt,.stDesconto",
            nanToZero: true,
            getInputValue: function (i) {
                return i.val().split(".").join("").replace(",", "."); 
            }
        }
    });
    return obj;
}

parseFloat.getInputValue:function(){},默認情況下,返回沒有逗號的輸入值,轉換時不會發生錯誤。 如果您的位置使用逗號進行小數分隔,例如在德語或巴西,您可以更改為

function(i){ 
    return i.val().split(".").join("").replace(",", "."); 
}

這將為您完成所有工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM