用于DataAnnotation验证属性的Int或Number数据类型


111

在我的MVC3项目中,我存储足球/足球/曲棍球/ ...体育比赛的得分预测。因此,我的预测类的属性之一如下所示:

[Range(0, 15, ErrorMessage = "Can only be between 0 .. 15")]
[StringLength(2, ErrorMessage = "Max 2 digits")]
[Remote("PredictionOK", "Predict", ErrorMessage = "Prediction can only be a number in range 0 .. 15")]
public int? HomeTeamPrediction { get; set; }

现在,int在我的情况下,我还需要更改数据类型的错误消息。使用了一些默认值-“字段HomeTeamPrediction必须为数字。”。需要找到一种方法来更改此错误消息。此验证消息似乎也可以预测远程验证之一。

我已经尝试过[DataType]属性,但这在system.componentmodel.dataannotations.datatype枚举中似乎不是简单的数字。

Answers:


221

对于任何数字验证,您都必须根据需要使用不同的范围验证:

对于整数

[Range(0, int.MaxValue, ErrorMessage = "Please enter valid integer Number")]

浮动

[Range(0, float.MaxValue, ErrorMessage = "Please enter valid float Number")]

对于双

[Range(0, double.MaxValue, ErrorMessage = "Please enter valid doubleNumber")]

4
在我看来,这对我不起作用。如果用户输入“ asdf”,则[Range(typeof(decimal),“ 0”,“ 9999.99”,ErrorMessage =“ {0}的值必须在{1}和{2}之间”)]引发异常。但是,如果我执行[Range(typeof(decimal),“ 0.1”,“ 9999.99”,ErrorMessage =“ {0}的值必须在{1}和{2}之间”)],该错误消息将正常工作。0 vs 0.1,没有任何意义。虫子?
meffect 2014年

1
此“整数”验证将非整数值视为有效值(例如0.3)
kevinpo

77

尝试以下正则表达式之一:

// for numbers that need to start with a zero
[RegularExpression("([0-9]+)")] 


// for numbers that begin from 1
[RegularExpression("([1-9][0-9]*)")] 

希望对您有帮助:D


13
有没有更简单的方法?我希望提供类似的信息:[Numeric(ErrorMessage =“此字段必须为数字”)]
Banford

3
抱歉不行。您始终可以编写自己的验证属性。
GoranŽuri'12

2
这是更好的解决方案,因为它涵盖了字符串。int.MaxValue仅涵盖至2.147.483.647
Christian Gollhardt 2015年

19

在数据注释中使用正则表达式

[RegularExpression("([0-9]+)", ErrorMessage = "Please enter valid Number")]
public int MaxJsonLength { get; set; }

2
如果该属性不是int而是字符串,则在问题的上下文中这似乎很好用。
Paul

1
为什么在正则表达式周围加上括号?可以[0-9]+吗?
polkduran

5
public class IsNumericAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            decimal val;
            var isNumeric = decimal.TryParse(value.ToString(), out val);

            if (!isNumeric)
            {                   
                return new ValidationResult("Must be numeric");                    
            }
        }

        return ValidationResult.Success;
    }
}

5

试试这个属性:

public class NumericAttribute : ValidationAttribute, IClientValidatable {

    public override bool IsValid(object value) {
        return value.ToString().All(c => (c >= '0' && c <= '9') || c == '-' || c == ' ');
    }


    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = FormatErrorMessage(metadata.DisplayName),
            ValidationType = "numeric"
        };
        yield return rule;
    }
}

并且您还必须在验证程序插件中注册属性:

if($.validator){
     $.validator.unobtrusive.adapters.add(
        'numeric', [], function (options) {
            options.rules['numeric'] = options.params;
            options.messages['numeric'] = options.message;
        }
    );
}

0

近十年过去了,但该问题对于Asp.Net Core 2.2仍然有效。

我通过data-val-number在消息中添加使用本地化来管理它:

<input asp-for="Age" data-val-number="@_localize["Please enter a valid number."]"/>

0

ASP.NET Core 3.1

这是我对该功能的实现,它可以在服务器端运行,并且可以与自定义错误消息一样灵活地进行jquery验证,就像其他任何属性一样:

属性:

  [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
    public class MustBeIntegerAttribute : ValidationAttribute, IClientModelValidator
    {
        public void AddValidation(ClientModelValidationContext context)
        {
            MergeAttribute(context.Attributes, "data-val", "true");
            var errorMsg = FormatErrorMessage(context.ModelMetadata.GetDisplayName());
            MergeAttribute(context.Attributes, "data-val-mustbeinteger", errorMsg);
        }

        public override bool IsValid(object value)
        {
            return int.TryParse(value?.ToString() ?? "", out int newVal);
        }

        private bool MergeAttribute(
              IDictionary<string, string> attributes,
              string key,
              string value)
        {
            if (attributes.ContainsKey(key))
            {
                return false;
            }
            attributes.Add(key, value);
            return true;
        }
    }

客户端逻辑:

$.validator.addMethod("mustbeinteger",
    function (value, element, parameters) {
        return !isNaN(parseInt(value)) && isFinite(value);
    });

$.validator.unobtrusive.adapters.add("mustbeinteger", [], function (options) {
    options.rules.mustbeinteger = {};
    options.messages["mustbeinteger"] = options.message;
});

最后是用法:

 [MustBeInteger(ErrorMessage = "You must provide a valid number")]
 public int SomeNumber { get; set; }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.