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

ASP.NET中Double类型验证自定义错误消息的实现方法

自定义Double类型属性的非数字输入错误消息

针对你遇到的问题,以下是几种可行的解决方案,帮你替换默认的英文错误消息:


方法一:控制器中修改ModelState错误消息

在处理表单提交的控制器方法里,直接检查并替换类型转换错误的消息:

[HttpPost]
public IActionResult Create(RoadRecord model)
{
    if (!ModelState.IsValid)
    {
        // 定位Fueling字段的类型转换错误
        if (ModelState.TryGetValue("Fueling", out var entry) && entry.Errors.Any())
        {
            var invalidError = entry.Errors.FirstOrDefault(e => e.ErrorMessage.Contains("is not valid for"));
            if (invalidError != null)
            {
                ModelState["Fueling"].Errors.Remove(invalidError);
                // 替换为自定义消息(这里用中文示例,可根据需求改成匈牙利语)
                ModelState["Fueling"].AddModelError("", "'Tankolás'字段必须输入有效的数字");
            }
        }
        return View(model);
    }

    // 后续保存逻辑
    return RedirectToAction(nameof(Index));
}

方法二:自定义验证属性

创建一个专属的验证属性,直接定义错误消息:

public class ValidDoubleAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        // 允许空值(因为属性是可空double?)
        if (value == null || string.IsNullOrWhiteSpace(value.ToString()))
            return true;

        // 适配匈牙利区域的逗号小数点格式
        return double.TryParse(value.ToString(), NumberStyles.Float, CultureInfo.GetCultureInfo("hu-HU"), out _);
    }

    public override string FormatErrorMessage(string name)
    {
        return $"'{name}'字段必须输入有效的数字";
    }
}

然后在模型属性上添加该注解:

[Display(Name = "Tankolás")]
[DisplayFormat(DataFormatString = "{0} l", ApplyFormatInEditMode = false)]
[ValidDouble]
public double? Fueling { get; set; }

方法三:客户端自定义验证(结合现有JS)

在你已有的ConvertDouble函数基础上,添加客户端实时验证逻辑,提前拦截错误:

function ConvertDouble() {
    var param = $("#Fueling").val();
    if (param.indexOf(".") != -1) {
        param = param.replace(".", ",");
    }
    $("#Fueling").val(param);
    // 触发验证
    validateFueling();
}

function validateFueling() {
    var inputVal = $("#Fueling").val().trim();
    var errorSpan = $("span[data-valmsg-for='Fueling']");
    let isValid = true;

    if (inputVal !== "") {
        // 匹配匈牙利格式的数字(允许逗号作为小数点)
        const numberRegex = /^-?\d+(,\d+)?$/;
        isValid = numberRegex.test(inputVal);
    }

    if (!isValid) {
        errorSpan.text("'Tankolás'字段必须输入有效的数字");
        errorSpan.show();
    } else {
        errorSpan.text("");
        errorSpan.hide();
    }
    return isValid;
}

// 输入时实时验证
$("#Fueling").on("input", validateFueling);

// 表单提交前验证
$("form").submit(function(e) {
    if (!validateFueling()) {
        e.preventDefault();
    }
});

额外优化:全局配置匈牙利区域

在项目的Program.cs(或Startup.cs)中配置全局区域,让框架自动适配区域格式:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

builder.Services.AddControllersWithViews()
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
    .AddDataAnnotationsLocalization();

var app = builder.Build();

var supportedCultures = new[] { "hu-HU", "en-US" };
var localizationOptions = new RequestLocalizationOptions()
    .SetDefaultCulture("hu-HU")
    .AddSupportedCultures(supportedCultures)
    .AddSupportedUICultures(supportedCultures);

app.UseRequestLocalization(localizationOptions);

内容的提问来源于stack exchange,提问作者kajahun123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:54:16