【问题标题】:mvc3 Custom validation attribute doesn't validate on client sidemvc3 自定义验证属性不在客户端验证
【发布时间】:2012-03-06 07:15:02
【问题描述】:

创建了一个自定义验证属性,我希望它也能在客户端工作。这是模型类

public class CreditCardAttribute : ValidationAttribute, IClientValidatable
    {
        public override bool IsValid(object value)
        {
            var number = Convert.ToString(value);
            return IsValidNumber(number);
        }
        private bool IsValidNumber(string number)
        {
            int[] DELTAS = new int[] { 0, 1, 2, 3, 4, -4, -3, -2, -1, 0 };
            int checksum = 0;
            char[] chars = number.ToCharArray();
            for (int i = chars.Length - 1; i > -1; i--)
            {
                int j = ((int)chars[i]) - 48;
                checksum += j;
                if (((i - chars.Length) % 2) == 0)
                    checksum += DELTAS[j];
            }

            return ((checksum % 10) == 0);
        }

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            yield return new ModelClientValidationRule { 
            ErrorMessage = this.ErrorMessage,
            ValidationType = "CreditCard"
            };

        }
    }

jQuery:

jQuery.validator.addMethod('CreditCardtest', function (value, element, params)
    {
    return false;
    });


    jQuery.validator.unobtrusive.adapters.add('CreditCard', { }, function(options){
        options.rules['CreditCardtest'] = true;
        options.messages['CreditCardtest'] = options.message;
    });

我不确定应该去 CreditCardTest 什么,我想将我在 Model 中的内容重写到这里吗?

谢谢

【问题讨论】:

  • 您真的想用 JavaScript 编写信用卡验证算法吗?并不是说这是一个秘密,但对我来说似乎完全没用。
  • 我没有,但我怎样才能让它工作?
  • 您在问如何将您的 C# 代码翻译成 javascript?
  • 好的,这就是现在发生的事情,我在模型中添加了IClientValidatable,并且我完全删除了 jquery 代码并且它可以工作。我认为它需要 jQuery 部分才能工作?
  • 什么有效?如果您删除了 jQuery 代码,您希望发生什么客户端验证?

标签: jquery asp.net-mvc-3 validation


【解决方案1】:

验证信用卡号可能是您不想为其实施客户端验证的事情。

但如果您对如何在一般情况下实现它感兴趣,您将不得不在您的服务器上用 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>
}

显然,所有脚本内容都进入一个单独的文件,而不是在视图中。为了便于阅读,我只是将其留在这里。

【讨论】:

    【解决方案2】:

    是的,如果您想验证客户端,您需要编写服务器端验证代码的 JavaScript 版本。 (因为这是被问到的问题,是时候回家了。)

    【讨论】:

      猜你喜欢
      • 2011-08-05
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 2014-03-27
      • 2011-09-09
      • 2013-11-12
      • 1970-01-01
      相关资源
      最近更新 更多