ASP.NET Core MVC:使用绑定将前端的格式化货币字符串转换为控制器中的十进制

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

我有一个这样的示例类:

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

在前端,

Amount
被视为具有以下格式的字符串:
$120,555.35
。那么,当我提交表单时,如何自动将此字符串格式转换为十进制格式?

我相信它应该在数据类型验证之前重新格式化。

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

感谢任何帮助,谢谢。

data-binding asp.net-core-mvc 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.