2012-02-14 149 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版本。 (因爲這是所問的問題,現在該回家了。)