Int hoặc Number DataType cho thuộc tính xác thực DataAnnotation


111

Trong dự án MVC3 của tôi, tôi lưu trữ dự đoán tỷ số cho trò chơi thể thao bóng đá / bóng đá / khúc côn cầu / .... Vì vậy, một trong các thuộc tính của lớp dự đoán của tôi trông như thế này:

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

Bây giờ, tôi cũng cần thay đổi thông báo lỗi cho một kiểu dữ liệu, inttrong trường hợp của tôi. Có một số mặc định được sử dụng - "Trường HomeTeamPrediction phải là một số.". Cần tìm cách thay đổi thông báo lỗi này. Thông báo xác thực này dường như cũng dự đoán cho xác thực từ xa.

Tôi đã thử [DataType]thuộc tính nhưng đây dường như không phải là số đơn giản trong system.componentmodel.dataannotations.datatypeliệt kê.

Câu trả lời:


221

Đối với bất kỳ xác thực số nào, bạn phải sử dụng xác thực phạm vi khác nhau theo yêu cầu của bạn:

Đối với số nguyên

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

cho phao

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

cho gấp đôi

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

4
Điều này không phù hợp với tôi trong bối cảnh của tôi. Nếu người dùng nhập "asdf", [Range (typeof (decimal), "0", "9999.99", ErrorMessage = "Giá trị cho {0} phải nằm trong khoảng từ {1} đến {2}")] sẽ đưa ra một ngoại lệ. Tuy nhiên, nếu tôi thực hiện [Range (typeof (decimal), "0,1", "9999.99", ErrorMessage = "Giá trị cho {0} phải từ {1} đến {2}")], thì thông báo lỗi sẽ hoạt động chính xác. 0 vs 0,1, không có ý nghĩa gì. có thể lỗi?
meffect,

1
Xác thực "số nguyên" này coi các giá trị không phải số nguyên là hợp lệ (ví dụ: 0,3)
kevinpo

77

Hãy thử một trong các cụm từ thông dụng sau:

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


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

hy vọng nó sẽ giúp: D


13
Không có cách nào đơn giản hơn? Tôi hy vọng điều gì đó như: [Numeric (ErrorMessage = "Trường này phải là một số")]
Banford

3
Tiếc là không có. Bạn luôn có thể viết thuộc tính xác thực của riêng mình.
Goran Žuri

2
Đây là giải pháp tốt hơn, vì điều này bao gồm các chuỗi. int.MaxValuechỉ bìa cho đến khi2.147.483.647
Christian Gollhardt

19

Sử dụng regex trong chú thích dữ liệu

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

2
Điều này dường như hoạt động tốt trong ngữ cảnh của câu hỏi, miễn là thuộc tính không phải là int, mà là chuỗi.
Paul

1
Tại sao lại đặt dấu ngoặc quanh biểu thức chính quy? Nó có thể chỉ là [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

Hãy thử thuộc tính này:

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

Và bạn cũng phải đăng ký thuộc tính trong plugin trình xác thực:

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

0

Gần một thập kỷ trôi qua nhưng vấn đề vẫn còn hiệu lực với Asp.Net Core 2.2.

Tôi đã quản lý nó bằng cách thêm data-val-numbervào trường đầu vào bản địa hóa sử dụng trên thông báo:

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

0

ASP.NET Core 3.1

Đây là cách tôi triển khai tính năng này, nó hoạt động ở phía máy chủ cũng như với xác thực jquery không phô trương với thông báo lỗi tùy chỉnh giống như bất kỳ thuộc tính nào khác:

Thuộc tính:

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

Logic phía máy khách:

$.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;
});

Và cuối cùng là Cách sử dụng:

 [MustBeInteger(ErrorMessage = "You must provide a valid number")]
 public int SomeNumber { get; set; }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.