Мой валидатор не соответствует требованиям, не возвращает правильное значение - PullRequest
1 голос
/ 14 апреля 2019

Я хотел бы создать свой собственный валидатор, который проверяет правильность PESEL в регистрационной форме.

Критерии:

  1. Поле не может быть пустымесли это ошибка.
  2. Числовое значение должно быть длиной 11 цифр, в противном случае ошибка.
  3. Если функция проверки не проверяет метод вычисления PESEL, она возвращает ошибку.

Принцип расчета PESEL:

Ниже мы рассмотрим 3 простых шага, как рассчитать контрольную цифру в номере PESEL.В качестве примера мы будем использовать номер 0207080362.

Умножим каждую цифру из номера PESEL на соответствующий вес: 1-3-7-9-1-3-7-9-1-3.0 * 1 = 0 2 * 3 = 6 0 * 7 = 0 7 * 9 = 63 0 * 1 = 0 8 * 3 = 24 0 * 7 = 0 3 * 9 = 27 6 * 1 = 6 2 * 3 = 6

Добавьте полученные результаты к себе.Обратите внимание, что если вы получили двузначное число в процессе умножения, добавьте только последнюю цифру (например, вместо 63 добавьте 3).0 + 6 + 0 + 3 + 0 + 4 + 0 + 7 +6 + 6 = 32 Вычтите результат из 10. Примечание: если вы получаете двузначное число во время сложения, вычтите только последнюю цифру (например,вместо 32 вычтите 2).Полученная вами цифра является контрольной цифрой.10 - 2 = 8 полный номер PESEL: 02070803628

Практически это не работает для меня, я всегда говорю что-то подобное в моей форме:

Что не так?

Ввод с пустым значением:

введите описание изображения здесь

Ввод с неправильным номером:

введите описание изображения здесь

Ввод с правильным номером:

введите здесь описание изображения

Код:

public class ValidatePesel : ValidationAttribute
    {
        int result_status = 0;
        public string errorLenght = "Długość numeru PESEL musi zawierać 11 cyfr";
        public string errorPesel = "numer PESEL jest niepoprawny";
        public string errorType = "Podana wartość nie jest numerem PESEL";

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)


 {
        string pesel = value.ToString();

        bool result_pesel = int.TryParse(pesel, out result_status);
        // Verification of PESEL correctness
        if (result_pesel)
        {
            if (pesel.Length == 11) // Check if the given length is correct
            {
                int[] weight = { 1, 3, 7, 9, 1, 3, 7, 9, 1, 3 }; // weights to calculate
                int sum = 0;
                int controlNum = int.Parse(pesel.Substring(10, 11)); // to the control value we assign the last number, the first one is the last one is 11 because 10 is the number 11 and then the length of the data
                for (int i = 0; i < weight.Length; i++)
                {
                    sum += int.Parse(pesel.Substring(i, i + 1)) * weight[i]; // we multiply each number by weight
                }

                sum = sum % 10; // we return the value of the checksum

                if (10 - sum == controlNum)
                {
                    return ValidationResult.Success;
                }
                else
                {
                    return new ValidationResult(errorPesel);
                }
            }
            else
                return new ValidationResult(errorLenght);
        }
        else
            return new ValidationResult(errorType);
    }
}

код, реализованный в модели:

namespace Clinic. Models
{
     public class RegistrationForPatient: ValidatePesel
     {
         public int Id {get; set; }

         // We create validation of user data, if the user leaves an empty field, it returns a message from the RequiredAttribute function
         [Required]
         [ValidatePesel]
         [Display (Name = "Pesel")]
         public string PESEL {get; set; }

         // Email validation, required field
         [Required]
         [Display (Name = "E-mail")]
         [EmailAddress]
         public string Email {get; set; }

         [Required (ErrorMessage = "Password field, can not be empty")]
         [Display (Name = "Password")]
         public string Password {get; set; }
        
         [Required (ErrorMessage = "Please repeat the password")]
         [Display (Name = "Repeat password")]
         public string RepeatPassword {get; set; }
     }
}

1 Ответ

0 голосов
/ 15 апреля 2019

Несколько ошибок с вашей стороны:

  • int max value - 2 147 483 647 - 10 цифр, вам нужно 11
  • подстрока 1 символа, а не 11 или i + 1

и рабочий код:

public class ValidatePesel : ValidationAttribute
{
    public string errorLenght = "Długość numeru PESEL musi zawierać 11 cyfr";
    public string errorPesel = "numer PESEL jest niepoprawny";
    public string errorType = "Podana wartość nie jest numerem PESEL";

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        string pesel = value.ToString();
        if (!decimal.TryParse(pesel, out decimal result_status)) return new ValidationResult(errorType);

        if (pesel.Length == 11)
        {
            int[] weight = { 1, 3, 7, 9, 1, 3, 7, 9, 1, 3 };
            int sum = 0;
            int controlNum = int.Parse(pesel.Substring(10, 1));

            for (int i = 0; i < weight.Length; i++)
            {
                sum += int.Parse(pesel.Substring(i, 1)) * weight[i];
            }

            sum = sum % 10;

            if (10 - sum == controlNum) return ValidationResult.Success;

            else return new ValidationResult(errorPesel);
        }
        else return new ValidationResult(errorLenght);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...