2011-02-25 11 views
7

JQuery 1.5 और बाद में 1.5.1 में अपग्रेड करने के बाद, मेरी तुलना सत्यापन विफल हो जाता है। मैं JQuery.Validate 1.7 का उपयोग कर रहा हूँ। माई व्यू मॉडेल में निम्नलिखित डेटा एनोटेशन हैं:JQuery 1.5 ब्रेक Validate की तुलना करें (JQuery मान्य 1.8)

/// <summary> 
/// Gets or sets the full name. 
/// </summary> 
/// <value>The full name.</value> 
[Required] 
[Display(Name = "fullname", ResourceType = typeof(Milkshake.Commerce.Model.Resources.Text))] 
public string FullName { get; set; } 

/// <summary> 
/// Gets or sets the email. 
/// </summary> 
/// <value>The email.</value> 
[DataType(DataType.EmailAddress)] 
[Display(Name = "email", ResourceType = typeof(Milkshake.Commerce.Model.Resources.Text))] 
[Required(ErrorMessageResourceName = "EmailRequired", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))] 
[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages), ErrorMessageResourceName = "EmailInvalid")] 
public string Email { get; set; } 

/// <summary> 
/// Gets or sets the password. 
/// </summary> 
/// <value>The password.</value> 
[DataType(DataType.Password)] 
[Display(Name = "password", ResourceType = typeof(Milkshake.Commerce.Model.Resources.Text))] 
[Required(ErrorMessageResourceName = "PasswordRequired", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))] 
[ValidatePasswordLengthAttribute(ErrorMessageResourceName = "PasswordLength", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))] 
public string Password { get; set; } 

/// <summary> 
/// Gets or sets the confirm password. 
/// </summary> 
/// <value>The confirm password.</value> 
[DataType(DataType.Password)] 
[Display(Name = "confirmPassword", ResourceType = typeof(Milkshake.Commerce.Model.Resources.Text))] 
[Required(ErrorMessageResourceName = "PasswordRequired", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))] 
[Compare("Password", ErrorMessageResourceName = "PasswordsMustMatch", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))] 
public string ConfirmPassword { get; set; } 

मैं जो भी मूल्य दर्ज करता हूं, पासवर्ड फ़ील्ड कभी समान नहीं होते हैं।

अद्यतन - एएसपी.नेट एंटीफोर्गेरी टोकन परेशानी में पड़ता है।

FireBug breakpoints की स्थापना में चारों ओर बेवकूफ बनाना के बाद, मैंने देखा है कि equalTo मान्यता समारोह में, jquery.validate.js में लाइन 1065 से शुरू होने वाले, लक्ष्य तत्व है कि पाया जाता है, नहीं पासवर्ड क्षेत्र है - लेकिन __RequestVerificationToken कि जब आप Html.AntiForgeryToken() सहायक का उपयोग करते हैं तो एएसपी.नेट एमवीसी लिखता है।

तो इसका मतलब है कि हम सही इनपुट तत्वों की तुलना भी नहीं कर रहे हैं। इस समस्या के समाधान के लिए, मैं jquery.validate.js फाइल करने के लिए एक गंदा हैक कहा:

// http://docs.jquery.com/Plugins/Validation/Methods/equalTo 
equalTo: function (value, element, param) { 
    // bind to the blur event of the target in order to revalidate whenever the target field is updated 
    // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead 
    var target = $(param).unbind(".validate-equalTo").bind("blur.validate-equalTo", function() { 
     $(element).valid(); 
    }); 

    if ($(target).is("input[type=hidden]") && $(target).attr("name") == "__RequestVerificationToken") { 
     var otherElementId = $(element).attr("id"); 
     var underScoreIndex = otherElementId.indexOf("_"); 
     otherElementId = otherElementId.substring(0, underScoreIndex + 1); 
     otherElementId += $(element).attr("data-val-equalto-other").substring(2); 

     target = $("#" + otherElementId); 
    } 

    return value == target.val(); 
} 

इस हैक, डेटा-वैल-equalto-अन्य विशेषता के मूल्य लेता है, और अपने स्वयं के आईडी के साथ यह मिश्रण, सही इनपुट तत्व खोजने के लिए। सभी मामलों में काम नहीं करेगा। लेकिन उपरोक्त मामले में, मेरे लिए काम करता है।

उत्तर

11

मैं पाया है कि इस jquery.validate.unobtrusive.js में एक त्रुटि

विनीत में कोड जोड़ता की वजह से है एक equalto एडाप्टर इसके नाम विशेषता के आधार पर मिलान तत्व खोजने की कोशिश करता है कि, निम्नलिखित कोड का उपयोग कर:

element = $(options.form).find(":input[name=" + fullOtherName + "]")[0]; 

fullOtherName चर अक्सर (और शायद हमेशा) एक अवधि के साथ, namespaced है तो jQuery sele सीटीओआर बहुत सारे इनपुट देता है, और पहले को चुनता है। अवधि आप दे .replace के साथ भाग जाने की आवश्यकता है, ("।", "\\।"):

element = $(options.form).find(":input[name=" + fullOtherName.replace(".", "\\.") + "]")[0]; 

ऐसा ही एक निर्माण कुछ लाइनें कम से मौजूद है, और यह भी तय किया जाना है (और साथ ही आवश्यकता होगी minified जावास्क्रिप्ट के रूप में)।

+0

यह काम करता है! आश्चर्य है कि अगर यह बग माइक्रोसॉफ्ट ब्रह्मांड में कहीं दायर किया गया है। अगली रिलीज में इसे ठीक करने के लिए मुझे माइक्रोसॉफ्ट कनेक्ट के जरिए इसकी रिपोर्ट करनी चाहिए। – MartinHN

+0

यह कोड में तय किया गया है। धन्यवाद। http://connect.microsoft.com/VisualStudio/feedback/details/665793/jquery-unobtrusive-validate-equalto-fails-with-compare-attribute – jsgoupil

+1

यह बहुत उपयोगी था! हालांकि, मेरे मामले में मुझे इसे तत्व = $ (options.form) में बदलना पड़ा। ढूँढें (": इनपुट [name = '" + fullOtherName.replace ("।", "\\।") + "']") [0]; इंजेक्शन मूल्य के चारों ओर एकल उद्धरण नोट करें। और इसे मिनी संस्करण में ठीक करने के लिए मत भूलना! :) –

0

http://bassistance.de/jquery-plugins/jquery-plugin-validation/

से कृपया ध्यान दें: नवीनतम रिलीज नहीं, अभी तक, jQuery 1.5.x. के साथ संगत है आप GitHub repository में एक संगत संस्करण पा सकते हैं।

हालांकि, शाखाओं में से कोई भी मेरे लिए काम करता ...

+0

दरअसल, यह 1.5 के साथ भी काम नहीं करता था। मुझे लगता है कि हमें इन मुद्दों को ठीक करने के लिए इंतजार करना होगा :( – MartinHN

+0

मुझे कुछ नई जानकारी मिली, ऊपर एक नज़र डालें। – MartinHN

+0

चीयर्स, मार्टिन! मेरी समस्या यह है कि मैं एंटीफॉर्गेरी टोकन का उपयोग नहीं करता ;-) –

0

मार्टिनएन के अपडेट के जवाब में, मुझे एक ही समस्या का सामना करना पड़ा और उसी फिक्स को लागू किया गया। जैसा कि मैं नेस्टेड संपादक टेम्पलेट का उपयोग कर रहा हूं, मेरे पास मेरे अन्य एलीमेंट आईडी में कई अंडरक्रॉरेस थे और इसलिए इंडेक्सऑफ के बजाय अंतिम इंडेक्सऑफ का उपयोग करने के लिए अपना कोड बदल दिया। जैसे

var underScoreIndex = otherElementId.lastIndexOf("_"); 
0

ऐसा लगता है कि अगर आप नए MVC4 कोड को देखो दिखता है:

var underScoreIndex = otherElementId.indexOf("_"); 

में बदल गया था। आप jquery.validate.unobtrusive का नया संस्करण देख सकते हैं।जेएस: http://code.msdn.microsoft.com/ASPNET-MVC-4-Mobile-e99ed0ed/sourcecode?fileId=49443&pathId=640259357 यदि आप एक अंतर करते हैं। यह एमवीसी 3 संस्करण के समान ही है जैसा कि ऊपर वर्णित मामूली परिवर्तनों को छोड़कर अलग तरीके से किया गया है। इसलिए यह होना चाहिए कि आपको केवल jquery.validate.unobtrusive.js को कोड उदाहरण में से एक के साथ बदलना है और सभी काम करेंगे।

बस इतना ही आपको पता है। मैं Jquery 1.6.4 का उपयोग कर रहा हूं Jquery मोबाइल 1.0.1

2

यदि यह अभी भी प्रासंगिक है, तो मेरे पास एक ही समस्या थी, सभी स्क्रिप्ट को अपग्रेड किया गया था और अब यह काम करता है। मैं निम्नलिखित का उपयोग कर रहा हूं: Jquery 1.8 (उनके सीडीएन से आधिकारिक संस्करण), Jquery सत्यापन 1.9 और माइक्रोसॉफ्ट द्वारा नैनजेट पर प्रदान किए गए नवीनतम पैकेज से jquery अविभाज्य सत्यापन (जो, अजीब बात है, आपको jquery सत्यापन 1.8 और 1.9 नहीं मिलता है)। ईश्वर माइक्रोसॉफ्ट और गड़बड़ी को 3 स्क्रिप्ट फाइलों के साथ प्रबंधित करने का प्रबंधन करता है: \

1

आप माइक्रोसॉफ्ट सीडीएन से jquery और jquery.validate के नवीनतम संस्करणों का उपयोग कर सकते हैं। मैं jquery.validate.unobtrusive.min.js का एक अद्यतन संस्करण नहीं देख सकता।

एमवीसी 4 के साथ भेजे गए jquery.validate.unobtrusive.min.js का संस्करण ठीक काम करता है।

<!-- Scripts --> 
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 
<script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.10.0/jquery.validate.min.js"></script> 
<!-- ToDo: Will Microsoft fix this on the CDN? --> 
<script type="text/javascript" src="@Url.Content("~/Scripts/Frameworks/jquery.validate.unobtrusive.min.js")"></script> 
संबंधित मुद्दे