【问题标题】:Custom number validation not working properly when value isn't a number当值不是数字时,自定义数字验证无法正常工作
【发布时间】:2019-04-17 17:37:21
【问题描述】:

我有自定义验证检查另一个字段,然后确定有问题的字段是否在某个数字范围内。每当用户输入数字时,它都可以正常工作。但是,如果用户传入一个非数字,则该非数字(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);
});

【问题讨论】:

  • 请向我们展示一个完整的示例以及您收到的错误消息。
  • 我不确定您还想要什么?当我包含逗号时,自定义验证会将传入的值读取为 null。当我不包含逗号时,该值成功传递到自定义验证中。
  • 逗号会使值变为字符串,然后您将遇到绑定问题。
  • 但我什至尝试在前端去掉逗号,但这并没有解决它。我已经添加了要显示的代码。
  • 如果你有一个点而不是逗号怎么办?

标签: c# asp.net-mvc validation


【解决方案1】:

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

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;
        }

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    相关资源
    最近更新 更多