2012-02-14 58 views
4

カスタム検証属性が作成されました。クライアント側でも同様に機能するようにしたいと考えています。こちらのモデルクラスはjQueryの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" 
      }; 

     } 
    } 

です:私はCreditCardTestに行くべきかわからない

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; 
    }); 

、私はここにするために、私はモデルを持っているものを書き直したいですか?

あなたは、クライアント側の検証したい場合は

+0

あなたは本当にJavaScriptでクレジットカードの検証アルゴリズムをコーディングしたいですか?それは秘密ではありませんが、私には全く役に立たないようです。 –

+0

私はしませんが、これをどのように機能させることができますか? –

+0

C#コードをjavascriptに変換する方法について質問していますか? –

答えて

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バージョンを書く必要がありますありがとうございました。

関連する問題