Пользовательская проверка аннотации данных Iban на стороне клиента - PullRequest
0 голосов
/ 30 марта 2020

В настоящее время я работаю над формой и хотел бы, чтобы сторона @client реагировала на проверку IBAN. Все стандартные аннотации данных c#. net работают, но у меня есть проблема с моей собственной аннотацией данных IBAN. Ненавязчивый плагин jquery - это то, что я использую для передачи сообщений об ошибках клиенту, но это не делает трюк для проверки ибана. Атрибут проверки iban действительно работает при отправке, но я хотел бы получить прямую ответную реакцию.

Я видел несколько постов, где они реализуют IClientModelValidator, но я не знаю, как это сделать в этой ситуации.

 public static class IbanValidator
{
    public static bool Validate(string iban)
    {
        if (string.IsNullOrEmpty(iban))
            return false;

        return ValidateChecksum(iban.ToUpper());
    }

    /// <summary>
    ///     Validates IBAN checksum
    /// </summary>
    /// <param name="iban">IBAN string</param>
    /// <returns>true/false</returns>
    private static bool ValidateChecksum(string iban)
    {
        if (iban.Length < 4 || iban[0] == ' ' || iban[1] == ' ' || iban[2] == ' ' || iban[3] == ' ')
            return false;

        var checksum = 0;
        var ibanLength = iban.Length;

        for (int charIndex = 0; charIndex < ibanLength; charIndex++)
        {
            if (iban[charIndex] == ' ') continue;

            int value;
            var c = iban[(charIndex + 4) % ibanLength];
            if (c >= '0' && c <= '9')
            {
                value = c - '0';
            }
            else if (c >= 'A' && c <= 'Z')
            {
                value = c - 'A';
                checksum = (checksum * 10 + value / 10 + 1) % 97;
                value %= 10;
            }
            else if (c >= 'a' && c <= 'z')
            {
                value = c - 'a';
                checksum = (checksum * 10 + value / 10 + 1) % 97;
                value %= 10;
            }
            else
            {
                return false;
            }

            checksum = (checksum * 10 + value) % 97;
        }

        return checksum == 1;
    }
}


public class IbanValidationAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        return IbanValidator.Validate(value as string)
            ? ValidationResult.Success
            : new ValidationResult(GetErrorMessage(validationContext));
    }

    private string GetErrorMessage(ValidationContext validationContext)
    {
        LocService errorTranslation = validationContext.GetService(typeof(LocService)) as LocService;
        return errorTranslation.GetLocalizedHtmlString("ErrorMessage_Invalid_Iban");
    }
}

1 Ответ

0 голосов
/ 30 марта 2020

Вам все равно потребуется создать отдельный Js файл, который обрабатывает проверку на стороне клиента.

Пример:

// Value is the element to be validated, params is the array of name/value 
$.validator.addMethod("iban", function (value, element, params) {
    // Code here
});

Затем вам нужно будет добавить его в ненавязчивый адаптеры:

  • jQuery .validator.unobtrusive.adapters.addBool - используется, когда вашему валидатору не нужны никакие дополнительные данные.
  • jQuery .validator.unobtrusive.adapters. addSingleVal - используется, когда ваш валидатор получает один фрагмент дополнительных данных.
  • jQuery .validator.unobtrusive.adapters.addMinMax - используется, когда ваш валидатор имеет дело с минимальными и максимальными значениями, такими как диапазон или длина строки.

ИЛИ:

jquery-validation предлагает проверку на стороне клиента в виде плагина:
https://github.com/jquery-validation/jquery-validation/blob/master/src/additional/iban.js

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