2013-02-15 28 views
71

Bir AJAX çağrısı aracılığıyla dinamik olarak yüklenen kısmi bir görünümle çalışmak için göze batmayan jquery doğrulaması almaya çalışırken sorun yaşıyorum.göze batmayan doğrulama dinamik içerikle çalışmıyor

Bu kodu şanssız çalışacak şekilde günlerimi harcıyorum.

@model MvcApplication2.Models.test 

@using (Html.BeginForm()) 
{ 
@Html.ValidationSummary(true); 
<div id="res"></div> 
<input id="submit" type="submit" value="submit" /> 
} 

Kısmi Görünüm:

@model MvcApplication2.Models.test 

@Html.TextAreaFor(m => m.MyProperty); 
@Html.ValidationMessageFor(m => m.MyProperty); 

<script type="text/javascript" > 
    $.validator.unobtrusive.parse(document); 
</script> 

Model:

public class test 
    { 
    [Required(ErrorMessage= "required field")] 
    public int MyProperty { get; set; } 
    } 

Denetleyici:

public ActionResult GetView() 
    { 
     return PartialView("Test"); 
    } 
İşte

Görünüm var

ve son olarak, javascript:

$(doument).ready(function() { 
$.ajax({ 
    url: '/test/getview', 
    success: function (res) { 

     $("#res").html(res); 
     $.validator.unobtrusive.parse($("#res")); 
    } 
}); 

$("#submit").click(function() { 
    if ($("form").valid()) { 
     alert('valid'); 
     return true; 
    } else { 
     alert('not valid'); 
     return false; 
    } 
}); 

doğrulama çalışmaz. Metin kutusuna herhangi bir bilgi girmese bile, gönderim olayı uyarıyı gösterir ('geçerli').

Ancak, görünümü dinamik olarak yüklemek yerine, ana Görünümde kısmi Görünümü oluşturmak için @Html.Partial("test", Model) kullanın (ve AJAX çağrısını yapmıyorum), sonra doğrulama işlemi gayet iyi çalışıyor.

Bu, muhtemelen içeriği dinamik olarak yüklerseniz, denetimler henüz DOM'de bulunmadığı için olabilir. Ama ben $.validator.unobtrusive.parse($("#res")); için yeni yüklenen denetimler hakkında doğrulayıcı izin vermek için yeterli olmalıdır ...

Herhangi biri yardımcı olabilir mi? Zaten ayrıştırılır bir form ayrıştırmak çalışırsanız

+1

Not 'unobtrusive.parse' işlev, bağımsız değişken bir öğe değil, gibi bir seçici alır. – Fred

+0

Ben de aynı problem vardı, ama mvc 2. ben adım adım gitmek: http://weblogs.asp.net/imranbaloch/archive/2010/07/11/asp-net-mvc-client- side-validation-with-dynamic content.aspx Bu ayrıca size yardımcı olabilir. http://weblogs.asp.net/imranbaloch/archive/2011/03/05/unobtrusive-client-side-validation-with-dynamic-contents-in-asp-net-mvc.aspx bu yardımı :) –

cevap

178

o forma dinamik unsuru eklerken yapabileceğini Ne

olduğunu güncelleme olmayacak ya

  1. Form en kaldırabilir ve doğrulama şöyle doğrulamak re:

    var form = $(formSelector) 
        .removeData("validator") /* added by the raw jquery.validate plugin */ 
        .removeData("unobtrusiveValidation"); /* added by the jquery unobtrusive plugin*/ 
    
    $.validator.unobtrusive.parse(form); 
    
  2. Erişim jquery data yöntemi kullanarak formun unobtrusiveValidation veriler: 01

    $(form).data('unobtrusiveValidation') 
    
    sonra kurallar koleksiyonuna erişebilir ve (biraz karmaşık olan) niteliklerini yeni öğeler ekleyin.

Ayrıca bir forma dinamik öğeler eklemek için kullanılan bir eklenti için Applying unobtrusive jquery validation to dynamic content in ASP.Net MVC bu makaleye göz atabilirsiniz. Bu eklenti 2. çözümü kullanır.

+11

Dostum Umut salla, günümü tamamen kurtardı! Harika cevap! –

+0

Toplam hayat kurtarıcı !. Çok teşekkürler. –

+0

Kendimden davet etmem gerektiğinden korktum. Bu sayfadan komut dosyası bir çekicilik gibi çalışır. – cezarypiatek

16

Nadeem Khedr'in cevabına ek olarak ....dinamik olarak DOM bir form yüklenir ve sonra (bahsedilen fazladan bit)

jQuery.validator.unobtrusive.parse(form); 

diyoruz ve daha sonra bu formu kullanarak ajax aramayı unutma göndermek için gidiyoruz ettiyseniz

$(form).valid() 
doğru veya yanlış döndürür (ve gerçek doğrulama çalışır) formunuzu göndermeden önce

.

+0

Merhaba, aynı sorunla karşı karşıyayım. dinamik görünümümü bir açılır pencerede gösteriyorum (jquery dialog). unobstrusive validations çalışmıyor. Dinamik görünümde veya başka bir yerde $ (form) .valid() öğesini nasıl arayabilirim? – mmssaann

3

testi bu:

if ($.validator.unobtrusive != undefined) { 
    $.validator.unobtrusive.parse("form"); 
} 
4

Bu soruyu bakıldığında

$(function() { 
     //parsing the unobtrusive attributes when we get content via ajax 
     $(document).ajaxComplete(function() { 
      $.validator.unobtrusive.parse(document); 
     }); 
    }); 
+2

Bu özellikle verimsizdir. – Liam

0

Şaşırtıcı, resmi ASP.NET dokümanlar hala hakkında herhangi bir bilgi yoktu senin _Layout.cshtml eklemek bu göze çarpmayan parse() yöntemi veya dinamik içerikle nasıl kullanılacağı. Dokümanlar repo'unda (Nadeem'in orijinal yanıtına bakın) bir issue yaratma özgürlüğünü ve düzeltmek için bir çekme isteği gönderdim. Bu bilgi şimdi model doğrulama konusundaki client side validation bölümünde görülebilir.

İlgili konular