Проверка номера кредитной карты - это, вероятно, то, для чего вы не хотите осуществлять проверку клиента.
Но если вам интересно, как этого добиться в общем случае, вам придется реализовать ту же логику, что и на вашем сервере, в javascript.
Есть только одна вещь, которая не так сваш пользовательский атрибут проверки, и это имя типа проверки, который должен содержать только строчные буквы:
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage,
ValidationType = "creditcard" // this should be only lowercase letters
};
}
Как только мы исправим, мы можем реализовать ту же логику проверки на клиенте:
@model MyViewModel
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script type="text/javascript">
var isValidNumber = function (value, element, params) {
var DELTAS = [0, 1, 2, 3, 4, -4, -3, -2, -1, 0];
var checksum = 0;
for (var i = value.length - 1; i > -1; i--) {
var j = value.charCodeAt(i) - 48;
checksum += j;
if (((i - value.Length) % 2) == 0) {
checksum += DELTAS[j];
}
}
return (checksum % 10) == 0;
};
jQuery.validator.addMethod('CreditCardtest', isValidNumber);
jQuery.validator.unobtrusive.adapters.add('creditcard', { }, function (options) {
options.rules['CreditCardtest'] = true;
options.messages['CreditCardtest'] = options.message;
});
</script>
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Number)
@Html.ValidationMessageFor(x => x.Number)
<button type="submit">OK</button>
}
Очевидно, что все содержимое скрипта помещается в отдельный файл, а не в представление.Я просто оставил его здесь для удобства чтения.