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
相关产品推荐
相关产品推荐

