2012-01-19 16 views
27

के साथ काम नहीं करता है, मैंने मॉडल 1 के साथ देखा है जहां मैंने Ajax.BeginForm() रखा है और इस दृश्य में मेरे पास मॉडल 2 के साथ पार्टियल व्यू है जहां मैंने Ajax.BeginForm() रखा है। तो केवल पहले फॉर्म में unobtrusive validation काम कर रहा है। क्यों केवल पहले फॉर्म में सत्यापन वैधता?अविभाज्य सत्यापन Ajax.BeginForm

पहले देखें

@model Model1 

@using (Ajax.BeginForm("Action1","Controller",null,new AjaxOption(){ onSuccess = "alert('=)')"},null) 
{ 

    <intput type="submit" value="Save" /> 
} 


Model2 model2 = new Model2(); 
@Html.EditorFor(m=>model2) 

** MODEL2 ध्यान में रखते हुए मेरे पास है। **

@model Model2 
@using (Ajax.BeginForm("AddStreet","Controller",new AjaxOption(){onSuccess = "alert('=)'")},option,null) 
{ 

     @Html.LabelFor(m => Model.Name): 
     @Html.TextBoxFor(m => Model.Name) 
     @Html.ValidationMessageFor(m => Model.Name) 

     <intput type="submit" value="Save" /> 
} 

धन्यवाद जवाब के लिए @Darin दिमित्रोव।

उत्तर

50

क्योंकि दूसरे दृश्य बाद में AJAX के साथ भरी हुई है और आप की जरूरत है कि अविश्वसनीय सत्यापन को सक्षम करने के लिए $.validator.unobtrusive.parse(...) पर कॉल करने के तुरंत बाद इसकी सामग्री को डीओएम में इंजेक्शन दिया गया है। अधिक जानकारी के लिए following blog post पर देखें।

@using (Ajax.BeginForm(
    "Action1", 
    "Controller", 
    null, 
    new AjaxOptions { 
     OnSuccess = "onSuccess", 
     UpdateTargetId = "result" 
    }, 
    null) 
) 
{ 
    <input type="submit" value="Save" /> 
} 

और फिर अपने जावास्क्रिप्ट फ़ाइल में:

अपने मामले में

तो, बजाय पहले AJAX कॉल के OnSuccess कॉलबैक में चेतावनी, एक जावास्क्रिप्ट समारोह जो इस पद्धति लागू करेगा की सदस्यता

var onSuccess = function(result) { 
    // enable unobtrusive validation for the contents 
    // that was injected into the <div id="result"></div> node 
    $.validator.unobtrusive.parse($(result)); 
}; 
+0

धन्यवाद यह काम करता है .. लेकिन मुझे आपकी नई समस्या है क्या आप मेरी मदद कर सकते हैं? मैं प्रश्न अपडेट करता हूं। –

+0

@ साशा, आपके दूसरे रूप में आपको सबमिट बटन के अलावा अन्य इनपुट फ़ील्ड शामिल नहीं करना प्रतीत होता है। तो आप नहीं हैं फॉर्म सबमिट होने पर सर्वर को कुछ भी भेजना। –

+0

मेरे पास इनपुट है लेकिन मैंने प्रश्न में नहीं दिखाया ... –

2

आप के भीतर Ajax Form

कुछ इस तरह सत्यापन सक्षम करने के jquery.unobtrusive-ajax.js के लिए एक संदर्भ जोड़ने के लिए:

<script type="text/javascript" src="/Scripts/jquery.unobtrusive-ajax.js"></script> 
+0

मेरे पास पृष्ठ के शीर्ष में यह संदर्भ है ... –

+0

@Sasha। तो अपने सभी कोड – gdoron

+0

दिखाएं मैं उदाहरण जोड़ता हूं .. –

22

आप आंशिक देखें भले ही वह साझा/_Layout में पहले से ही है आप में उन लोगों के 2 फ़ाइलें जोड़ने की जरूरत है। cshtml:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 

या अपने आंशिक में रखें:

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

लेआउट और आंशिक दृश्य दोनों को क्यों डालने की आवश्यकता है? – gog

+0

इसकी वजह यह है कि सत्यापन काम नहीं करेगा, शॉर्टंड विधि: इसे फिर से कॉल करें .. प्रभावी लेकिन आदर्श नहीं –

+0

@ डीपेरेज़, मैंने अपने कोड में अपना समाधान जोड़ा और मैं पूरी तरह से काम करता हूं लेकिन अब एक परेशान जेएस त्रुटि "टाइप एरर: मालिक अनिर्धारित है" हर बार पॉपिंग कर रहा है। कोई भी समाधान? –

1

यह समाधान मेरे लिए सबसे अच्छा काम किया।

$.validator.unobtrusive.parse(document); 
0

डैरिन दिमित्रोव का जवाब केवल जब तक अजाक्स सफलता हैंडलर कहा जाता है जब jquery validate plugin की validate() बुलाया नहीं किया गया है काम करता है। मैं ऐसे परिदृश्य के बारे में नहीं सोच सकता जहां यह मामला हो सकता है, इस प्रकार मुझे आश्चर्य है कि जवाब सही क्यों स्वीकार किया गया था।

मुद्दा यह है कि validate() निम्न पंक्ति पहले

// Check if a validator for this form was already created 
var validator = $.data(this[ 0 ], "validator"); 
if (validator) { 
    return validator; 

जिसका अर्थ है कि सत्यापनकर्ता वस्तु है निष्पादित करता है:

शायद अतीत में वें jQuery मान्य कोड में बदलाव अब निम्न समस्या का कारण मान्य होने पर लौटाया जाता है() को पास किए गए विकल्पों के बिना और आगे संभालने के लिए बुलाया जाता है।

यह भी मतलब है $.validator.unobtrusive.parse(...) या $.validator.unobtrusive.parseElement(...) करने के लिए एक बाद में कॉल जो सत्यापनकर्ता के विकल्पों को अपडेट करना एक

$form.validate(this.options) <- this.options holds the new rules parsed from HTML 

कार्यान्वित कोई प्रभाव नहीं है कि क्योंकि विकल्प बिल्कुल संसाधित नहीं कर रहे हैं।

यहाँ समाधान मैन्युअल रूप से की तरह

var $htmlCode = $("your html"); 

$.validator.unobtrusive.parse($htmlCode, true); // true means no validate() call 

// now get the validation info collected in parse() 
var validationInfo = $form.data("unobtrusiveValidation"); 

var $validator = $form.validate(); // get validator and ... 
$validator.settings.rules = validationInfo.options.rules; // ... update its rules 
$validator.settings.messages = validationInfo.options.messages; // ... update its messages 

प्रपत्र (जैसे सबमिट करें क्लिक) Revalidating अब अपेक्षित परिणाम में परिणाम चाहिए सत्यापनकर्ता अद्यतन करने के लिए है।

-

एक तरफ ध्यान दें के रूप में, मैन्युअल सत्यापनकर्ता को अद्यतन करने की तरह

$yourHtmlField.rules("add", { 
    required: true, 
    messages: { 
    required: "Required input" 
    } 
}); 

rules() विधि का उपयोग कर के रूप में इस सीधे विनीत सामान के बिना सत्यापनकर्ता के नियमों को अद्यतन करता द्वारा भी संभव है। लेकिन फिर डेटा-वैल विशेषताओं को बेकार प्रदान किया जाता है।

संबंधित मुद्दे