You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core部署cPanel后MySQL小数存储异常问题咨询

问题分析与解决方案

问题根源

你遇到的小数存储异常,核心原因是服务器与客户端的区域文化不匹配:

  • 客户端输入使用欧洲区域格式,用逗号,作为小数分隔符(比如4,21)
  • cPanel服务器默认可能使用英文区域格式,把逗号识别为千分位分隔符,导致4,21被解析成421,存入数据库后就变成421.00

你本地的修复代码其实无效——因为方法参数已经是decimal类型,说明模型绑定已经完成,后面的ToString再Parse属于重复操作,本地能正常工作只是因为本地服务器的区域设置和客户端一致。


有效解决方案

方案1:全局配置ASP.NET Core使用指定区域文化

在Program.cs中设置应用的默认区域文化,强制使用支持逗号小数分隔的格式(比如瑞典语sv-SE):

var builder = WebApplication.CreateBuilder(args);

// 添加全局区域文化配置
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    var supportedCultures = new[]
    {
        new CultureInfo("sv-SE"), // 瑞典文化,对应逗号小数分隔
        // 可选:添加其他支持的文化
    };

    options.DefaultRequestCulture = new RequestCulture("sv-SE");
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;
});

// 其他服务配置...

var app = builder.Build();

// 启用区域中间件(必须放在路由之前)
app.UseRequestLocalization();

// 其他中间件...

app.Run();

方案2:自定义小数模型绑定器

如果不想修改全局文化,可以自定义模型绑定器,专门处理带逗号的小数输入:

  1. 创建自定义绑定器:
public class DecimalModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
            throw new ArgumentNullException(nameof(bindingContext));

        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (valueProviderResult == ValueProviderResult.None)
            return Task.CompletedTask;

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

        var value = valueProviderResult.FirstValue;
        if (string.IsNullOrEmpty(value))
            return Task.CompletedTask;

        // 替换逗号为点,用不变文化解析
        try
        {
            var formattedValue = value.Replace(',', '.');
            var decimalValue = decimal.Parse(formattedValue, CultureInfo.InvariantCulture);
            bindingContext.Result = ModelBindingResult.Success(decimalValue);
        }
        catch (FormatException)
        {
            bindingContext.ModelState.TryAddModelError(bindingContext.ModelName, "请输入有效的小数格式");
        }

        return Task.CompletedTask;
    }
}
  1. 在模型类的小数属性上标记绑定器:
public class ProductVM
{
    // 其他属性...
    [ModelBinder(BinderType = typeof(DecimalModelBinder))]
    public decimal PurchasePrice { get; set; }

    [ModelBinder(BinderType = typeof(DecimalModelBinder))]
    public decimal SellingPrice { get; set; }

    [ModelBinder(BinderType = typeof(DecimalModelBinder))]
    public decimal Weight { get; set; }

    [ModelBinder(BinderType = typeof(DecimalModelBinder))]
    public decimal Dimension { get; set; }
}

方案3:前端转换为不变文化格式发送

修改前端addProduct函数,把输入的逗号替换为点后再发送:

function addProduct() {
    var articleNumber = $('#typeArticleNumberX').val();
    // 替换逗号为点,统一用点作为小数分隔符
    var purchasePrice = $('#typePurchasePriceX').val().replace(',', '.');
    var sellingPrice = $('#typeSellingPriceX').val().replace(',', '.');
    var weight = $('#typeWeightX').val().replace(',', '.');
    var dimension = $('#typeDimensionX').val().replace(',', '.');
    var material = $('#typeMaterialX').val();
    var quantity = $('#typeQuantityX').val();

    $.ajax({
        url: '/Product/Product',
        method: 'POST',
        data: {
            articleNumber: articleNumber,
            purchasePrice: purchasePrice,
            sellingPrice: sellingPrice,
            weight: weight,
            dimension: dimension,
            material: material,
            quantity: quantity
        },
        // 其他代码不变...
    });
}

同时,printLabel函数也需要做同样的替换:

function printLabel() {
    var articleNumber = $('#typeArticleNumberX').val();
    var purchasePrice = $('#typePurchasePriceX').val().replace(',', '.');
    var sellingPrice = $('#typeSellingPriceX').val().replace(',', '.');
    var weight = $('#typeWeightX').val().replace(',', '.');
    var dimension = $('#typeDimensionX').val().replace(',', '.');
    var material = $('#typeMaterialX').val();
    var quantity = $('#typeQuantityX').val();

    var formData = new FormData();
    // 其他代码不变...
}

内容的提问来源于stack exchange,提问作者dev-113

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:34:55