2011-02-11 20 views
9

MVC DataAnnotations ve jQuery göze batmayan javascript kütüphanesini kullanarak özel bir doğrulayıcı yazdım. Harika çalışıyor. Şu anda sahip olduğum tek sorun, ilk doğrulamadan sonra, kullanıcının alanı düzenlediyse, her tuş vuruşu üzerinde doğrulayıcıyı ateşlemektir. Doğrulayıcı, girişi doğrulamak için bir web servisine ulaştığından, kullanıcının alandan çıktığı veya formun gönderildiği zaman girişi her zaman doğrulamasını tercih ederim. Bu davranışı değiştirmenin bir yolu var mı? Benim kodum:Her bir tuşa basmadan özel validator'yu durdurma

<script type="text/javascript"> 
    $.validator.addMethod("validate_zipcode", function (value, element) { 
     if (value == null || value.length == 0) { 
      return true; 
     } 

     var isValid = false; 
     $.ajax({ 
      async: false, 
      dataType: "json", 
      url: "/api/iszipvalid/" + value, 
      success: function (response) { 
       isValid = response; 
      } 
     }); 

     return isValid; 
    }); 

    $.validator.unobtrusive.adapters.addBool('zipcode', 'validate_zipcode'); 
</script> 

cevap

10

değilim pozitif bu (ben bir test projesi sonra kırbaç), ancak validate böyle validate tüm örneklerini set defaults yapmanızı sağlar ASP.NET MVC ile birlikte çalışacak:

$.validator.setDefaults({ onkeyup: false }); 

MVC, validate üzerinde bir tanıtıcıya sahip olmadan önce bu satırı ekleyebilir, ancak tüm formlardaki tüm alanlar için onkeyup'u devre dışı bırakır (postanız tarafından karar vererek, bu tamam olur gibi görünür).

Bu yardımcı olur umarım.

+0

Bu işe yaradı, teşekkürler! – Scott

+0

Bunu yaptım ve hala her tuşa (veya backspace) validator yöntemini çağırıyor, ancak alandan çıkarken değil! Başka ne deneyebilirim? –

3

Yeni bir tane başlatmadan önce ajax isteğinizi iptal edebilirsiniz. You kodu aşağıdaki gibi olabilir:

<script type="text/javascript"> 
    var request = null; 

    $.validator.addMethod("validate_zipcode", function (value, element) { 
    if (value == null || value.length == 0) { 
     return true; 
    } 

    if (request != null) { 
     request.abort(); 
    } 

    var isValid = false; 
    request = $.ajax({ 
     async: false, 
     dataType: "json", 
     url: "/api/iszipvalid/" + value, 
     success: function (response) { 
      isValid = response; 
     } 
    }); 

    return isValid; 
    }); 

    $.validator.unobtrusive.adapters.addBool('zipcode', 'validate_zipcode'); 
</script> 

Bu kundakçı kullanılarak yapılan aramalarda bakarsak jquery UI otomatik tamamlama yaptığı iştir.

+0

Yanılıyorsam, düzeltin, ancak bu işlem devam ederse ajax isteğini iptal eder, değil mi? Yine de, bulanıklaştırma olayı yerine anahtarda doğrulamayı denemeye çalışacak, ancak aynı anda yalnızca bir çağrı yapacak mı? – Scott

+0

Evet, bildiğim kadarıyla, anahtarlama dışındaki doğrulamaları değiştirmenin bir yolu olmadığının farkındayım. Özel doğrulama ile aynı şeyi yapan yeni Uzak niteliğine bakmaya değer olabilir, ancak bu, isteği iptal ederek de çalışır. – lancscoder

+0

Uzak özniteliğini kullanmalıyım, ancak doğrulamaya dayalı olarak gerçekleşen (diğer UI öğelerinin ayarlanması) bir çok özel mantık vardır. Bunu başka bir alanda da yaptım (e-posta adresi - zaten var olmadığından emin olmak için), ancak her tuşa basmak için DB'ye ulaşıyor. Olayı "anahtar" yerine "bulanıklaştır" olarak değiştirmenin bir yolu olmalı ... – Scott

İlgili konular