В настоящее время я работаю над формой и хотел бы, чтобы сторона @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");
}
}