NetCore 使用绑定将前端的格式化货币字符串转换为控制器中的小数

问题描述 投票:0回答:1

我有一个像这样的示例类:

public class TestClass
{
[Precision(18,2)]
public decimal? Amount{get;set;}
}

在前端,它以字符串形式威胁,示例格式如下:$120,555.35。那么,在提交表单时,如何将此字符串格式自动转换为十进制格式呢?我相信它应该在 netcore 进行数据类型验证之前重新格式化。

[HttpPost]
public async Task<IActionResult> Create([FromForm] TestClass request)
{
...
}

感谢任何帮助,谢谢。

.net-core model-view-controller data-binding model-binding
1个回答
0
投票

您可以像下面这样自定义模型绑定器来实现您的要求:

public class CustomDecimalModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }

        var modelName = bindingContext.ModelName;
        var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);

        if (valueProviderResult == ValueProviderResult.None)
        {
            return Task.CompletedTask;
        }

        bindingContext.ModelState.SetModelValue(modelName, valueProviderResult);

        var value = valueProviderResult.FirstValue;

        if (string.IsNullOrWhiteSpace(value))
        {
            return Task.CompletedTask;
        }

        // Remove currency symbols and commas, then parse
        value = value.Replace("$", "").Replace(",", "");

        if (decimal.TryParse(value, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out decimal decimalValue))
        {
            bindingContext.Result = ModelBindingResult.Success(decimalValue);
        }
        else
        {
            bindingContext.ModelState.TryAddModelError(modelName, "Invalid decimal value");
        }

        return Task.CompletedTask;
    }
}

将活页夹应用到

Amount
属性:

public class TestClass
{
    [Precision(18, 2)]
    [ModelBinder(BinderType = typeof(CustomDecimalModelBinder))]
    public decimal? Amount { get; set; }
}

参考:ASP.NET Core 中的自定义模型绑定

© www.soinside.com 2019 - 2024. All rights reserved.