विनीत सत्यापन गतिशील सामग्री के साथ काम नहीं कर रहा है


96

मुझे एक आंशिक दृश्य के साथ काम करने के लिए विनीत jquery सत्यापन प्राप्त करने की कोशिश करने में समस्या हो रही है जो AJAX कॉल के माध्यम से गतिशील रूप से भरी हुई है।

मैं इस कोड को बिना किसी भाग्य के काम करने के लिए बिता रहा हूं।

यहाँ देखें:

@model MvcApplication2.Models.test

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

आंशिक दृश्य:

@model MvcApplication2.Models.test

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

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

आदर्श:

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

नियंत्रक:

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

और अंत में, जावास्क्रिप्ट:

$(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;
    }
});

सत्यापन काम नहीं करता है। यहां तक ​​कि अगर मैं टेक्सबॉक्स में कोई जानकारी नहीं भरता हूं, तो सबमिट ईवेंट अलर्ट ('वैध') दिखाता है।

हालांकि, अगर गतिशील रूप से दृश्य लोड करने के बजाय, मैं @Html.Partial("test", Model)मुख्य दृश्य में आंशिक दृश्य प्रस्तुत करने के लिए उपयोग करता हूं (और मैं AJAX कॉल नहीं करता हूं), तो सत्यापन ठीक काम करता है।

यह शायद इसलिए है क्योंकि अगर मैं सामग्री को गतिशील रूप से लोड करता हूं, तो DOM में नियंत्रण मौजूद नहीं है। लेकिन मैं एक कॉल करता हूं, $.validator.unobtrusive.parse($("#res")); जो नए लोड किए गए नियंत्रणों के बारे में सत्यापनकर्ता को बताने के लिए पर्याप्त होना चाहिए ...

क्या कोई मदद कर सकता है?


मुझे भी यही समस्या थी, लेकिन mvc 2 में। मैं इस तरह से कदम से कदम मिलाकर चलता हूं: weblogs.asp.net/imranbaloch/archive/2010/07/11// यह भी आपकी मदद कर सकता है। weblogs.asp.net/imranbaloch/archive/2011/03/05/… आशा है कि इस मदद :)
नरेश परमार

2
ध्यान दें, unobtrusive.parseफ़ंक्शन एक तर्क के रूप में चयनकर्ता लेता है, एक तत्व नहीं।
फ्रेड

जवाबों:


226

यदि आप एक ऐसे फॉर्म को पार्स करने की कोशिश करते हैं जो पहले से ही पार्स है तो वह अपडेट नहीं होगा

जब आप गतिशील तत्व को फॉर्म में जोड़ते हैं तो आप क्या कर सकते थे

  1. आप प्रपत्र की मान्यता को हटा सकते हैं और इसे इस तरह मान्य कर सकते हैं:

    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 dataविधि का उपयोग करके फ़ॉर्म के डेटा तक पहुँचें :

    $(form).data('unobtrusiveValidation')

    फिर नियम संग्रह तक पहुंचें और नए तत्वों की विशेषताओं को जोड़ें (जो कुछ जटिल है)।

आप इस लेख को एएसपी.नेट एमवीसी में डायनामिक कंटेंट के लिए विनीत जक्वेरी सत्यापन लागू करने पर भी देख सकते हैं । यह प्लगइन 2 के समाधान का उपयोग करता है।


17
यार तुम रॉक, पूरी तरह से मेरा दिन बचाया! बहुत बढ़िया जवाब!
दिमितर दिमित्रोव

मुझे डर था कि मैं इसे खुद से आमंत्रित करूं। उस पेज की स्क्रिप्ट एक आकर्षण की तरह काम करती है।
सेज़ेरिपीएटेक

कोड, महान काम करता है - त्वरित अपडेट (यदि मैं हो सकता है) 1. मैं नॉकआउट का उपयोग कर रहा हूं और खेतों के नाम अच्छी तरह से प्राप्त कर रहा हूं तो यह एक समस्या की तरह लग रहा है। $ .validator.unobtrusive.parseDynamicContent ( 'फॉर्म'); (सभी फ़ील्ड प्राप्त करने के लिए), सबमिट करते समय अंत में। 2. यह अच्छा है johnnyreilly.github.io/jQuery.Validation.Unwellrusive.Native/… आपको फ़ील्ड्स को नाम देने का एक तरीका है (जो कि आवश्यक प्रतीत हो रहा है? मैं अन्य 2 के jquery unbrusive bootstrap ontop का उपयोग कर रहा हूं?) परिस्थितियाँ शायद अलग हैं)
रिचर्ड होशम

बस ध्यान दें कि आपके द्वारा लागू की गई किसी भी फॉर्म की विशिष्ट सेटिंग को फॉर्म को वापस करते समय चूक से $("form").data("validator").settingsहटा दिया जाएगा । यह डायनेमिक फ़ील्ड्स को शामिल करने का एक शानदार तरीका है, लेकिन प्रत्येक ताज़ा पार्स पर किसी भी कस्टम इनिशियलाइज़ेशन कोड को दोहराना सुनिश्चित करें। $(formSelector).removeData("validator")$.validator.defaults
काइलमिट

19

नदीम केदार के जवाब के अतिरिक्त…।

यदि आपने गतिशील रूप से अपने DOM में एक फ़ॉर्म लोड किया है और फिर कॉल करें

jQuery.validator.unobtrusive.parse(form); 

(उल्लेख किए गए अतिरिक्त बिट्स के साथ) और फिर अजाक्स का उपयोग करके कॉल करने के लिए याद करने के लिए उस फॉर्म को सबमिट करना होगा

$(form).valid()

जो आपके फॉर्म जमा करने से पहले सही या गलत (या वास्तविक सत्यापन चलाता है)।


नमस्ते, उसी मुद्दे का सामना करना पड़ im। im एक पॉप अप (jquery संवाद) में मेरे गतिशील दृश्य दिखा रहा है। अवास्तविक सत्यापन काम नहीं कर रहे हैं। मैं अपने डायनेमिक दृश्य में $ (फ़ॉर्म) .valid () को कहां कहता हूं या कुछ और कहां से करता हूं?
मम्स्स्सन

मैं हमेशा फॉर्म को $ (फ़ॉर्म) के अंदर गलत तरीके से वापस भेजने से रोक रहा था। क्योंकि मैं एक AJAX सबमिट कर रहा था, लेकिन तब मुझे AJAX सबमिट नहीं करने का एक तरीका चाहिए था जब सत्यापन विफल हो गया। $ (फॉर्म) .valid () उत्तर है! धन्यवाद!
jgerman

6

इसे अपने _Layout.cshtml में जोड़ें

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

3
यह विशेष रूप से अक्षम है।
लियाम

5

हैरानी की बात यह है कि जब मैंने इस सवाल को देखा, तो आधिकारिक ASP.NET डॉक्स को अभी भी विनीत parse()विधि के बारे में या गतिशील सामग्री के साथ इसका उपयोग करने के बारे में कोई जानकारी नहीं थी । मैंने डॉक्स रेपो (@ नदीम के मूल उत्तर का उल्लेख करते हुए) पर एक मुद्दा बनाने और इसे ठीक करने के लिए एक पुल अनुरोध प्रस्तुत करने की स्वतंत्रता ली । यह जानकारी अब मॉडल सत्यापन विषय के ग्राहक पक्ष सत्यापन अनुभाग में दिखाई देती है ।



2

मैं उसी समस्या में फंस गया और इसके अलावा कुछ भी काम नहीं किया:

$(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);
}

और जोड़

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

जहाँ आप फ़ॉर्म को सहेजने की कोशिश कर रहे हैं।

मैं अजाक्स कॉल के माध्यम से फॉर्म को बचा रहा था।

आशा है कि यह किसी की मदद करेगा।


1
यह एक मेरे लिए काम किया है। मैं पिछले कई दिनों से एक समाधान पा रहा था, यह asp.net कोर 2 में काम करता है। धन्यवाद।
प्रदीप रूपरेलिया

0

बस इस कोड को फिर से मोडल कोड के अंत में कॉपी करें

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

;)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.