Int или Number DataType для атрибута проверки DataAnnotation - PullRequest
97 голосов
/ 27 января 2011

В моем проекте 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.

Ответы [ 6 ]

196 голосов
/ 18 июня 2013

Для проверки любого номера вы должны использовать различные проверки диапазона в соответствии с вашими требованиями:

для целых чисел

[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")]
71 голосов
/ 26 февраля 2011

Попробуйте регулярное выражение

[RegularExpression("([0-9]+)")]      // for 0-inf or 
[RegularExpression("([1-9][0-9]*)"] // for 1-inf

надеюсь, это поможет: D

14 голосов
/ 10 августа 2016

Использовать регулярное выражение в аннотации данных

[RegularExpression("([0-9]+)", ErrorMessage = "Please enter valid Number")]
public int MaxJsonLength { get; set; }
6 голосов
/ 04 января 2013

Попробуйте этот атрибут:

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;
        }
    );
}
3 голосов
/ 04 апреля 2014
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;
    }
}
0 голосов
/ 23 мая 2019

прошло почти десятилетие, но проблема все еще действительна и в Asp.Net Core 2.2.

Мне удалось это, добавив data-val-number в поле ввода локализацию использования в сообщении:

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