Как установить минимальные и максимальные аннотации для свойства с расширениями аннотаций данных? - PullRequest
4 голосов
/ 07 декабря 2011

Как установить минимальную и максимальную аннотацию для свойства с расширениями аннотаций данных?

Вот что я пробовал:

[Required(ErrorMessage = "Dette felt er påkrævet!")]
        [Digits(ErrorMessage = "Indtast kun cifre")]
        [Min(8, ErrorMessage = "Brugernavnet skal være 8 tegn langt.")]
        [Max(8, ErrorMessage = "Brugernavnet skal være 8 tegn langt.")]
        [Display(Name = "Brugernavn")]
        public string UserName { get; set; }

Я получаю следующую ошибку:

Имена типов проверки в ненавязчивых правилах проверки клиента должны быть уникальными. Следующий тип проверки был просмотрен несколько раз: диапазон

Ответы [ 2 ]

7 голосов
/ 07 декабря 2011

Мин. И Макс. Для десятичных типов.Для строк вы используете атрибуты [StringLength] или [RegularExpression]:

[StringLength(8, MinimumLength = 8)]
public string UserName { get; set; }
2 голосов
/ 24 апреля 2012

У меня была такая же проблема, как у Кенчи. Я хотел использовать [Min] и [Max] одновременно, чтобы у меня было отдельное сообщение об ошибке для каждого типа ошибки вместо диапазона. Я тоже столкнулся с ...

Validation type names in unobtrusive client validation rules must be unique. The
following validation type was seen more than once: range

Потому что они решили использовать одно и то же имя проверки для обоих типов!

Я справился с этим, сохранив мин и создав собственный Int Max.

Добавьте этот класс где-нибудь, в идеале в классе CustomerValidation

 public class MaximumDecimalCheck : ValidationAttribute, IClientValidatable
    {
        private readonly int _max;
        private readonly string _defaultErrorMessage = "";
        public MaximumDecimalCheck(int max, string defaultErrorMessage)
            : base(defaultErrorMessage)
        {
            _max = max;
            _defaultErrorMessage = defaultErrorMessage.Replace("{0}", _max.ToString());
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if (value == null)
                return null;

            int intValue;
            bool parsedDecimal = int.TryParse(value.ToString(), out intValue);
            if (parsedDecimal)
            {
                if (intValue < _max)
                {
                    return ValidationResult.Success;
                }
            }
            return new ValidationResult(_defaultErrorMessage);
        }

        public override string FormatErrorMessage(string name)
        {
            return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, _max);
        }

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            var modelClientValidationRule = new ModelClientValidationRule();
            modelClientValidationRule.ValidationType = "checkmaxint";
            modelClientValidationRule.ErrorMessage = _defaultErrorMessage;
            modelClientValidationRule.ValidationParameters.Add("maxint", _max.ToString());

            return new List<ModelClientValidationRule> { modelClientValidationRule };
        }
    }

Тогда в вашем модельном объекте

    [Required(ErrorMessage = "Monthly income (after tax) required")]
    [DataType(DataType.Currency)]
    [Display(Name = "Monthly income (after tax)")]
    [Min(200, ErrorMessage = "You do not earn enough")]
    [MaximumDecimalCheck(10000, "You earn to much a month")]
    public decimal? MonthlyIncomeAfterTax { get; set; }

тип свойства может быть десятичным, int и т. Д., Однако он будет анализироваться только как int.

Я не смог создать статический тип десятичной дроби, поэтому быстро сдался, если кто-то может ответить на этот вопрос, я был бы очень счастлив.

После добавления обозначения обратитесь к следующему javascript.

(function ($) {

    /*
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT
    */
    jQuery.validator.unobtrusive.adapters.add("checkmaxint", ['maxint'], function (options) {
        options.rules["checkmaxint"] = options.params;
        options.messages["checkmaxint"] = options.message;
    });

    jQuery.validator.addMethod("checkmaxint", function (value, element, params) {
        var maxValue = params.maxint;
        var inputValue = value;

        var parsedInt = parseInt(inputValue);
        if (isNaN(parsedInt)) {
            return false;
        }
        else if (parsedInt > maxValue) {
            return false;
        }
        else {
            return true;
        }
    });
    /*
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT
    */



} (jQuery));

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...