2010-01-11 16 views
12

ASP.NET MVC 2'de özel istemci tarafı doğrulaması için Phil Haack's post okudum. Aynı şeyi jQuery bağdaştırıcısı ile kullanmak ve ASP.NET MVC 2 RC kullanarak (MVC 2 Beta'nın aksine bu yazıyı kullanmak istiyorum)) kullanır. Bunu nasıl yapacağını anlayabilecek biri var mı?ASP.NET MVC 2 RC'de özel istemci tarafı jQuery doğrulama nasıl yazılır?

Özel olarak parola eşleştirme doğrulamasını uygulamak istiyorum (yani parola & parolanın eşleşmesi gerektiğini doğrulayın). ASP.NET MVC 2 RC VS.NET proje şablonu, sunucu tarafında (PropertiesMustMatchAttribute kullanarak) ancak istemci tarafında nasıl uygulanacağını gösterir.

+0

burada iki soru tür vardır: 1) nasıl istemci tarafında modeli düzey doğrulama yapıyoruz? 2) jQuery'yi kullanarak bu doğrulamayı nasıl yürütüyorsunuz? İkisi de ilginç sorular. Bunu dahil etmek için soru başlığını güncellemek isteyebilirsiniz. (Ben # 1 cevabıyla ilgileniyorum ama bu soruya yanlışlıkla rastladım.) –

cevap

15

Ben zaten burada http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx) MS AJAX istemci doğrulama ile çalışan özel doğrulama almak için nasıl Phil Haack talimatlarını takip varsayalım. jQuery ile çalışmak elde etmek için, MicrosoftMvcJQueryValidation.js dosyasını değiştirmeniz gerekir: __MVC_CreateRulesForField (validationField) işlevinde

  • , bir vaka deyimi eklemeniz gerekir. Phil örnekten devam edersek, eklemeniz gerekir:

    vaka "fiyat":

    __MVC_ApplyValidator_Price (rulesObj, thisRule.ValidationParameters [ "dak"]);

    kopması;

  • Ardından __MVC_ApplyValidator_Price işlevi oluşturmak gerekir:

fonksiyon __MVC_ApplyValidator_Price (nesne, değer) {

// min is what jQuery Validate uses to validate for minimum values 
object["min"] = value; 

}

Phil almak için yeterli olmalıdır örnek çalışma

Artık, PropertiesMustMatchAttribute doğrulamanızla ilgili olarak, MVC, sınıfları süsleyen nitelikler için istemci tarafı json doğrulama tanımını oluşturur. PropertiesMustMatchAttribute modelde kullanılmalıdır (ve özellik değil), istemci tarafı doğrulamasını tetiklemeyi nasıl yapacağımı anlayamıyorum. Bunun yerine farklı bir yaklaşımda bulundum. IsValid() yüklemesi her zaman doğru olarak döndüren ve bu özelliği bir özellikte kullanan bir kukla doğrulama özniteliği oluşturdum. Bu, doğrulama mantığını jQuery validator's equalTo işlevine atayacak bir kukla özelliktir. İşte

public class PropertiesMustMatchClientTriggerAttribute : ValidationAttribute 
{ 
    public string MatchProperty { get; set; } 

    public PropertiesMustMatchClientTriggerAttribute(string matchProperty) 
    { 
     MatchProperty = matchProperty; 
     ErrorMessage = "{0} doesn't match {1}."; 
    } 
    public override bool IsValid(object value) 
    { 
     return true; 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, MatchProperty); 
    } 
} 

özel doğrulayıcı edilir:

DataAnnotationsModelValidatorProvider.RegisterAdapter (typeof:

public class PropertiesMustMatchClientTriggerValidator : DataAnnotationsModelValidator<PropertiesMustMatchClientTriggerAttribute> 
{ 
    private string _message; 
    private string _matchProperty; 

    public PropertiesMustMatchClientTriggerValidator(ModelMetadata metaData, ControllerContext context, PropertiesMustMatchClientTriggerAttribute attribute) 
     : base(metaData, context, attribute) 
    { 
     _message = attribute.FormatErrorMessage(metaData.DisplayName); 
     _matchProperty = attribute.MatchProperty; 
    } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
    { 
     var rule = new ModelClientValidationRule 
     { 
      ErrorMessage = _message, 
      ValidationType = "equalTo" 
     }; 
     rule.ValidationParameters.Add("matchField", _matchProperty); 

     return new[] { rule }; 
    } 
} 

üstünde bulunan özel doğrulayıcı Phil Blog başına Application_Start() kayıtlı olması gerekmektedir Aşağıda, model özellik bulunuyor (PropertiesMustMatchClientTriggerAttribute), typeof (PropertiesMustMatchClientTriggerValidator));

Son olarak, MicrosoftMvcJQueryValidation öğesini değiştirmeniz gerekir.js dosyası:

  • __MVC_CreateRulesForField için aşağıdaki vaka deyimi ekleyin:

vaka "equalTo":

__MVC_ApplyValidator_EqualTo (rulesObj, thisRule.ValidationParameters [ "matchField"]);

kopması; Artık bir mülke kukla doğrulama özelliğini eklemek gerekir

fonksiyon __MVC_ApplyValidator_EqualTo (nesne, elemId) {

object["equalTo"] = document.getElementById(elemId); 

}:

  • bu işlevi ekleyin

    [PropertiesMustMatchClientTrigger("Password")] 
        public string ConfirmPassword { get; set; } 
    

    Bunu yapmalı.

    Bu dummy niteliğini oluşturmak biraz çirkin, bu yüzden birilerinin daha zarif bir çözüm bulabilmesini umuyorum.

+0

Ayrıntılı yanıt için teşekkürler. Bunu deneyeceğim ve sonucu daha sonra güncelleyeceğim. –

+0

Sadece bu konuda hızlı bir takip. Brad Wilson'ın C4MVC'deki konuşmasına dayanarak (http://www.viddler.com/explore/c4mvc/videos/24/), MVC ekibi MVC 3'teki model düzeyinde ek açıklamalar için istemci tarafı doğrulamasını uygulamayı düşünmektedir. Bu tür bir sorunun çözülmesi daha kolay olacaktır. –

+0

Sonunda çözümünüzü denedim ve çekicilik gibi çalışıyor. Çok teşekkürler! –

1

İşte özel jQuery doğrulama eklemek için:

$.validator.addMethod("noSpaces", function(value, element) { 
    if ($(element).val().indexOf(" ") >= 0) { 
     return false; 
    } else { 
     return true; 
    } 
}, "Value must not contain spaces"); 
+0

Bu özel yöntemi ASP.NET MVC 2'nin doğrulama motoruna nasıl entegre edebilirsin? –

+0

Phil'in gönderisine dayanarak, tek başına isim yapmalıdır. Ama henüz denemedim. –

İlgili konular