2012-02-14 151 views
4

创建一个自定义验证属性,我希望它也能在客户端工作。下面是Model类mvc3自定义验证属性不验证客户端

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,难道我要重写我已经在模型吗?

谢谢

+0

你真的想在javascript中编码信用卡验证算法吗?不是说这是一个秘密,但对我来说似乎完全没用。 – 2012-02-14 22:20:39

+0

我不这样做,但是我怎样才能使这个工作? – 2012-02-14 22:21:50

+0

你问如何将你的C#代码翻译成JavaScript? – 2012-02-14 22:33:15

回答

4

验证信用卡号码可能是您不想实施客户端验证的一种方式。

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

显然所有脚本的东西进入一个单独的文件,而不是在视图内。为了便于阅读,我只是把它放在这里。

1

是的,如果你想验证客户端,你需要写你的服务器端验证代码JavaScript版本。 (因为这是所问的问题,现在该回家了。)