Soru Parametrelerle ASP.NET MVC 3 istemci tarafı doğrulama


Bu gönderiden sonra Özel özellik için istemci tarafı doğrulaması gerçekleştirin

Bunu nasıl yapacağımı kafamdan alıyorum, istemci tarafındaki komut dosyasına ek parametreler geçiriyorum

Anladığım kadarıyla, MVC 3 ile özel doğrulama uygulamak için şu ana kadar gerekli

Özel bir doğrulama özelliği oluştur

ValidationAttribute dayanarak ve IClientValidatable uygulayarak. Ayrıca, hem ValidationAttribute hem de IClientValidatable'ın işlevselliğini uygulayan ModelValidator'dan türeyen bazı örnekler görüyorum. Bu, farklılıkların ne olduğu veya ModelValidator'un MVC 2'de kullanılıp kullanılmadığı konusunda şimdiki ilk kafa karışıklığımdır, ancak şimdi kullanımdan kaldırılmış mıdır?

ModelClientValidationRule örneğinin, hata iletisi, ValidationType (istemci tarafı doğrulaması gerçekleştirecek Javascript işlevinin adı olduğunu anladığım) ve bu özelliğin ek özel parametreleri gibi ayrıntıları belirtmek için GetClientValidationRules () 'den döndürülmelidir. olabilir ve bu Javascript doğrulamasına geçirilmesi gerekir.

Çalışma zamanının (hangisinin olduğundan emin değil) ModelClientValidationRule Etiket öğelerinde html özniteliğini aşağıdaki gibi oluşturmak için:

data-val="true"  (to indicate that the element requires validation)
data-val-[ValidationType]=[ErrorMessage]
data-val-[ValidationType].[ValidationParameters(n).Key]=[ValidationParameters(n).Value]

İstemci tarafı doğrulama mantığını uygulayın

Bir javascript işlevi oluşturulmalı ve jQuery.validators.addmethod () ile jQuery.validators'a eklenmelidir, böylece JQuery yürütülmesi gerektiğinde bunun farkındadır. Gibi bir şey:

jQuery.validator.addMethod(
    'greaterThan', 
    function (value, element, params) {
        /.../
       return /* true or false   */ ; 
    },
    ''
); 

Buradaki sorum, imza işlevinin (değer, öğe, params), doğrulama işlemlerini gerçekleştirecek yöntemler için standart olup olmadığıdır ve bir form gönderilmeden önce veya bir zamanın gönderilmesi gibi uygun bir zamanda bazı jQuery işlevleri tarafından çağrılacağını varsayalım eleman, fukları veya keyUp olaylarını kaybeder. Sadece bunu nasıl kontrol edebileceğinize inanmıyorum, yani özel geçerlilik için hangi etkinliğin uygun olduğunu seçin.

Göze batmayan bir adaptör uygulayın

Bu, göze çarpmayan nitelikleri; Çok açık bir şey değilim, ama jQuery Kuralı olduğunu varsayalım, ama bu işlerin nasıl olduğu konusunda net değilim. Gibi bir şey

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

Benim sorum şu: 'işlev (seçenekler)' hakkında. Bu, işlevden önce (fonksiyon, değer, params) çağrılacak olan ve göze batmayan etiketlerin jQuery.Validation tarafından anlaşılabilen bir veri yapısına çıkarılmasından sorumlu olan işlevdir. Kod örneğinden göründüğümde, seçeneklerin her ikisini de içeren bir nesne olduğunu, etiketin nitelik değerlerini (options.message gibi) ve eşleşmesi gereken jQuery ile ilgili özellikleri (options.messages ['ClientSideValidationFunctionName'] gibi) Eğer öyleyse özel parametreler nasıl alınır ve haritalanır.

Umarım herhangi bir ek karışıklık eklemedim.


54
2018-01-24 17:19


Menşei


Göze batmayan doğrulama, HTML-öznitelikleri, data-max-value = "5" gibi öğe üzerinde eklenir ve vücut içeriğinin dışında javascript bunları arar ve javascript'i doğrudan HTML öğesine eklemek yerine doğrulama işlemini gerçekleştirir. - Rich


Cevaplar:


Kullanabilirsiniz ValidationParameters kurala özel parametreler eklemek için özellik:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
    var rule = new ModelClientValidationRule
    {
        ErrorMessage = this.ErrorMessage,
        ValidationType = "futuredate",
    };
    rule.ValidationParameters.Add("param1", "value1");
    rule.ValidationParameters.Add("param2", "value2");
    yield return rule;
}

adaptörde kullanılabilir:

jQuery.validator.unobtrusive.adapters.add(
    'futuredate', 
    [ 'param1', 'param2' ],
    function (options) {
        var param1 = options.params.param1; // shall equal 'value1'
        var param2 = options.params.param2; // shall equal 'value2'
        // TODO: use those custom parameters to define the client rules
    }
);

GÜNCELLEŞTİRME:

Yorumlar bölümünde istenen şekilde, bu parametreleri özel geçerlilik kuralına nasıl geçirebileceğinizi burada görebilirsiniz:

jQuery.validator.unobtrusive.adapters.add(
    'futuredate', 
    [ 'param1', 'param2' ],
    function (options) {
        // simply pass the options.params here
        options.rules['greaterThan'] = options.params;
        options.messages['greaterThan'] = options.message;
    }
);

jQuery.validator.addMethod('greaterThan', function (value, element, params) {
    // params here will equal { param1: 'value1', param2: 'value2' }
    return ...
}, '');

64
2018-01-24 17:24



tamam harika. Ayrıca, betikteki doğrulamayı gerçekleştirecek bu paramları nasıl referans gösterdiğimi de gösterir misiniz? Şu an sıkıştığım yer burası. Doğrulama için yöntem imzasının işlev olduğunu anlıyorum (değer, eleman, param), ancak param1 ve param2'nin nasıl geçtiğinden emin değilim. - ricardo
@ricardo, ilk sorunuzla ilgili olarak, ModelValidator GetClientValidationRules yöntemini ortaya çıkardığından IClientValidatable ile aynı şeyi elde etmenizi sağlar. İkinci sorununla ilgili olarak, bu jquery doğrulamadır. - Darin Dimitrov
@ricardo, ValidationAttribute, modelinizin tek bir özelliği üzerinde çalışırken, ModelValidator, tüm model üzerinde hareket eder. - Darin Dimitrov
ModelValidator yaklaşımı MVC2'den geliyor ve bence, MVC3 projesinde ileriye gidilmemelidir. MVC3 ValidationAttribute / IClientValidatable yaklaşımı çok daha temizdir ve bağdaştırıcıyı kaydetmek için global.asax'ı değiştirmeyi içermez. - Paul Hiles
Kutsal saçmalık, bu yorum satırı tam olarak ihtiyacım olan şey. Ben mvc için güncelledim bir mvc 2 site ile çalışıyorum 3. bu DataAnnotationsModelValidator ve burada açıklanan tüm bu şeyler kullanır özel bir "RequiredIf" ValidationAttribute vardır: haacked.com/archive/2009/11/19/.... Eski yoldan ve bu yeni mvc3 yapmanın yollarından çok kafam karışıyordu. Görünüşe göre aynı şeyi başardılar. Bu belgelerin için teşekkürler (ve yukarı), microsoft! iç çekmek  Teşekkürler Darin, ricardo ve Çiçek Adam! - kdawg