Int або Number DataType для атрибута перевірки DataAnnotation


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перерахунку.

Відповіді:


221

Для перевірки будь-якого числа вам потрібно використовувати різні перевірки діапазону відповідно до ваших вимог:

Для Integer

[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 (десятковий), "0,1", "9999,99", ErrorMessage = "Значення для {0} має бути від {1} до {2}")], повідомлення про помилку спрацює правильно. 0 проти 0,1, не має сенсу. помилка, можливо?
meffect

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
На жаль, немає. Ви завжди можете написати свій атрибут перевірки.
Горан Журі

2
Це краще рішення, оскільки воно охоплює рядки. int.MaxValueтільки обкладинка до2.147.483.647
Крістіан Голхардт

19

Використовуйте регулярний вираз в анотації даних

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

2
Здається, це спрацює добре в контексті запитання, за умови, що властивість не int, а string.
Пол

1
Чому дужки навколо регулярного виразу? Чи може це бути просто [0-9]+?
полкдуран

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; }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.