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

ASP.NET Core 6中Double属性的Range与DataType验证未触发

解决ASP.NET Core 6服务器端验证自定义消息不生效问题

问题根源

当输入"ASD"这类非数字字符串时,ASP.NET Core的模型绑定器无法将其转换为double类型,会直接生成模型绑定错误——数据验证属性(如[DataType]、[Range])是在模型绑定成功后才执行的,因此自定义错误消息不会触发,显示的是模型绑定阶段的默认提示。

解决方案

方法1:手动替换绑定错误消息

在页面模型的提交处理方法中,检查并替换目标属性的绑定错误:

public async Task<IActionResult> OnPostAsync()
{
    // 定位SpecialEquipmentAmount的格式转换错误
    var amountError = ModelState["SpecialEquipmentAmount"]?.Errors.FirstOrDefault(e => e.Exception is FormatException);
    if (amountError != null)
    {
        ModelState["SpecialEquipmentAmount"].Errors.Clear();
        ModelState["SpecialEquipmentAmount"].AddError("my message");
    }

    if (!ModelState.IsValid)
    {
        return Page();
    }

    // 业务逻辑处理
    return RedirectToPage("./Success");
}

方法2:自定义验证属性

创建兼顾类型转换、范围验证的自定义属性,完全控制验证逻辑:

public class ValidCurrencyAttribute : ValidationAttribute
{
    private readonly double _min;
    private readonly double _max;

    public ValidCurrencyAttribute(double min, double max)
    {
        _min = min;
        _max = max;
        ErrorMessage = "my message";
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value == null || string.IsNullOrWhiteSpace(value.ToString()))
        {
            return new ValidationResult(ErrorMessage);
        }

        if (!double.TryParse(value.ToString(), out var amount))
        {
            return new ValidationResult(ErrorMessage);
        }

        if (amount < _min || amount > _max)
        {
            return new ValidationResult(ErrorMessage);
        }

        return ValidationResult.Success;
    }
}

修改页面模型属性的验证标记(若要彻底避免绑定错误,可将属性类型改为string):

[BindProperty]
[Required(ErrorMessage = "my message")]
[ValidCurrency(0.00, 999999999.99)]
public string SpecialEquipmentAmount { get; set; }

// 使用时手动转换为数值
double amount = double.Parse(SpecialEquipmentAmount);

方法3:全局配置绑定错误消息

若需统一应用内所有数字类型的绑定错误提示,在Program.cs中全局配置:

builder.Services.AddRazorPages()
    .AddMvcOptions(options =>
    {
        options.ModelBindingMessageProvider.SetValueMustBeANumberAccessor(
            _ => "my message");
    });

内容的提问来源于stack exchange,提问作者Fernando Gómez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:07:32