dinamik içerikle çalışmayan göze çarpmayan doğrulama


98

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

Şansım olmadan bu kodu çalıştırmak için günler harcıyorum.

İşte Görünüm:

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

Kontrol eden, denetleyici:

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

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ışmıyor. Metin kutusuna herhangi bir bilgi girmesem bile, gönderme olayı uyarıyı ('geçerli') gösteriyor.

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

Bunun nedeni muhtemelen içeriği dinamik olarak yüklersem, kontrollerin henüz DOM'da mevcut olmamasıdır. Ama $.validator.unobtrusive.parse($("#res")); onaylayıcıya yeni yüklenen kontroller hakkında izin vermek için yeterli olması gereken bir arama yapıyorum ...

Biri yardım edebilir mi ?


Ben de aynı sorunu yaşadım, ancak mvc 2'de şu şekilde adım adım geçiyorum : weblogs.asp.net/imranbaloch/archive/2010/07/11/… Bu da size yardımcı olabilir. weblogs.asp.net/imranbaloch/archive/2011/03/05/… Bu yardımı umuyoruz :)
Naresh Parmar

2
Unutmayın, unobtrusive.parseişlev bir seçiciyi öğe olarak değil, argüman olarak alır.
Fred

Yanıtlar:


231

Zaten ayrıştırılmış bir formu ayrıştırmaya çalışırsanız, güncellenmez

Forma dinamik öğe eklediğinizde ne yapabilirsiniz?

  1. Formun doğrulamasını kaldırabilir ve şu şekilde yeniden doğrulayabilirsiniz:

    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. unobtrusiveValidationJquery datayöntemini kullanarak form verilerine erişin :

    $(form).data('unobtrusiveValidation')
    

    daha sonra kural koleksiyonuna erişin ve yeni öğelerin niteliklerini ekleyin (bu biraz karmaşıktır).

Bir forma dinamik öğeler eklemek için kullanılan bir eklenti için ASP.Net MVC'de göze çarpmayan jquery doğrulamasını dinamik içeriğe uygulama hakkındaki bu makaleye de göz atabilirsiniz . Bu eklenti 2. çözümü kullanır.


17
Ahbap sen harikasın, günümü tamamen kurtardım! Harika cevap!
Dimitar Dimitrov

Onu kendim davet etmemden korkuyordum. Bu sayfadaki komut dosyası bir cazibe gibi çalışıyor.
cezarypiatek

Kod, harika çalışıyor - hızlı güncelleme (mümkünse) 1. Nakavt kullanıyorum ve alanların adlarını iyi alıyorum, bu bir sorun gibi görünüyor. $ .validator.unobtrusive.parseDynamicContent ('form'); (tüm alanları almak için), gönderirken sonunda. 2. Bu güzel johnnyreilly.github.io/jQuery.Validation.Unobtrusive.Native/… size alanları adlandırmanın bir yolunu vermek için (ki bu gerekli görünüyor? Diğer 2'nin üzerinde jquery engellemez önyükleme kullanıyorum, yani benim koşullar muhtemelen farklıdır)
Richard Housham

Forma özel uyguladığınız tüm ayarların , formu yeniden oluştururken varsayılanlarla $("form").data("validator").settingskaldırılacağını $(formSelector).removeData("validator")ve değiştirileceğini unutmayın $.validator.defaults. Bu, dinamik alanları dahil etmenin harika bir yoludur, ancak her yeni ayrıştırmada herhangi bir özel başlatma kodunu tekrarladığınızdan emin olun.
KyleMit

19

Nadeem Khedr'in cevabına ek olarak ...

DOM'nuza dinamik olarak bir form yüklediyseniz ve ardından

jQuery.validator.unobtrusive.parse(form); 

(belirtilen ekstra bitlerle) ve ardından ajax kullanarak bu formu gönderecekler, aramayı unutmayın

$(form).valid()

formunuzu göndermeden önce doğru veya yanlış döndüren (ve gerçek doğrulamayı çalıştıran).


merhaba, aynı sorunla karşı karşıyayım. dinamik görünümümü bir açılır pencerede gösteriyor (jquery iletişim kutusu). göze batmayan doğrulamalar çalışmıyor. $ (form) .valid () 'i dinamik görünümümde nerede veya başka nerede çağırırım?
mmssaann

Bir AJAX gönderimi yaptığım için $ (form) .submit içinde yanlış döndürerek formun gönderilmesini her zaman engelliyordum, ancak daha sonra doğrulama başarısız olduğunda AJAX gönderimini çağırmamak için bir yola ihtiyacım vardı. $ (form) .valid () cevaptır! Teşekkür ederim!
jgerman

6

bunu _Layout.cshtml dosyanıza ekleyin

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

3
Bu özellikle verimsizdir.
Liam

6

Şaşırtıcı bir şekilde, bu soruyu incelediğimde, resmi ASP.NET belgeleri, göze çarpmayan parse()yöntem veya dinamik içerikle nasıl kullanılacağı hakkında hala herhangi bir bilgiye sahip değildi . Dokümanlar deposunda (@ Nadeem'in orijinal cevabına atıfta bulunarak) bir sorun yaratma ve düzeltmek için bir çekme talebi gönderme özgürlüğünü aldım . Bu bilgiler artık model doğrulama konusunun istemci tarafı doğrulama bölümünde görülebilir .


3

bunu test et:

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

2

Aynı sorundan etkilendim ve bunun dışında hiçbir şey işe yaramadı:

$(document).ready(function () { 
    rebindvalidators();
});

function rebindvalidators() {
    var $form = $("#id-of-form");
    $form.unbind();
    $form.data("validator", null);
    $.validator.unobtrusive.parse($form);
    $form.validate($form.data("unobtrusiveValidation").options);
}

ve Ekle

// Check if the form is valid
var $form = $(this.form);
if (!$form.valid())
    return;

formu kaydetmeye çalıştığınız yer.

Formu Ajax aramasıyla kaydediyordum.

Umarım bu birine yardımcı olur.


1
Bu benim için çalıştı. Son günlerden bir çözüm buluyordum, asp.net core 2'de çalışıyor. Teşekkürler.
Pradip Rupareliya

0

sadece bu kodu modsal kodun sonuna kopyalayın

    <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

;)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.