首页 > 解决方案 > 当值不是数字时,自定义数字验证无法正常工作

问题描述

我有自定义验证检查另一个字段,然后确定有问题的字段是否在某个数字范围内。每当用户输入数字时,它都可以正常工作。但是,如果用户传入一个非数字,这个非数字(value参数)不会被传递给验证。而是null传递给验证。我宁愿传入带有逗号的数字。相反,用户会看到一个"The value XXX is not valid for XXX没有帮助的神秘信息。我也[Required][Numeric]此字段上的数据注释。这些通常会发现任何问题。但是,如果用户输入带逗号的有效数字,则该值不会传递给我的自定义验证。我不确定问题出在哪里。有什么想法吗?我尝试通过 javascript 去除逗号,但传递给我的自定义验证的值仍然为空。这是我正在调用的自定义验证:

public sealed class RequiresRangeAmount : ValidationAttribute
{
    public RequiresRangeAmount(string property)
    {
        Property = property;
    }

    public string Property { get; set; }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var property = validationContext.ObjectType.GetProperty(Property);

        if (property != null)
        {
            var loanSubType = (int)property.GetValue(validationContext.ObjectInstance, null);

            if (loanSubType == LoanSubTypeConstants.Visa|| loanSubType == LoanSubTypeConstants.Visa2)
            {
                var valueConverted = Convert.ToDecimal(value);
                if (valueConverted < 5000 || valueConverted > 75000)
                {
                    return new ValidationResult(ErrorMessage);
                }
            }
        }

        return null;
    }
}

这里正在使用:

[Required]
[Numeric]
[RequiresRangeAmount("LoanSubType", ErrorMessage = "A VISA must be in XXX range.")]
[DisplayName("Requested Loan Amount")]
public decimal? RequestedAmount { get; set; }

去掉逗号的前端没有帮助:

$("#mainForm").submit(function() {
    var strippedCommasAmount = $("#RequestedAmount").val().replace(/,/g, '');
    $("#RequestedAmount").val(strippedCommasAmount);
});

标签: c#asp.net-mvcvalidation

解决方案


不知道它是否有帮助,但我现在在我的所有项目中都使用了这个功能:

public static double DoubleParseAdvanced(this string strToParse, char decimalSymbol = '.')
        {
            string tmp = Regex.Match(strToParse, @"([-]?[0-9]+)([\s])?([0-9]+)?[." + decimalSymbol + "]?([0-9 ]+)?([0-9]+)?").Value;

            if (tmp.Length > 0 && strToParse.Contains(tmp))
            {
                var currDecSeparator = System.Windows.Forms.Application.CurrentCulture.NumberFormat.NumberDecimalSeparator;

                tmp = tmp.Replace(".", currDecSeparator).Replace(decimalSymbol.ToString(), currDecSeparator);
                return double.Parse(tmp);
            }

            return double.NegativeInfinity;
        }

第一,它适用于任何计算机文化(500.5 或 500,5)

第二,如果用户输入的不是数字,你只需要返回 NegativeInfinite,所以你只需要检查返回的值是否不等于 NegativeInfinity 就可以知道值是否正确。


推荐阅读