2011-07-25 5 views
17

मैं नीचे दिए गए कोड का उपयोग कर एक नए उपयोगकर्ता के लिए एक दृश्य मॉडल बनाना चाहता हूं। "उपयोगकर्ता" श्रेणी में केवल दो गुण होते हैं (अब के लिए सरलीकृत) कि मैं डेटाबेस तक जारी रहूंगा; दृश्य मॉडल "पासवर्ड की तुलना करें" फ़ील्ड जोड़ता है, जिसका उपयोग केवल दृश्य में किया जाता है। मैं "उपयोगकर्ता" में परिभाषित सभी फ़ील्ड को दोहराने के बजाय दृश्य मॉडल को सीधे "उपयोगकर्ता" वर्ग का उपयोग करना पसंद करूंगा।तुलना करें (पासवर्ड) विशेषता

मेरा प्रश्न है कि मैं "तुलना करें" फ़ील्ड के लिए [तुलना] विशेषता में "User.Password" का सही तरीके से संदर्भ कैसे लगा सकता हूं?

public class User 
{ 
    [Required] 
    public string UserName { get; set; } 

    [Required] 
    [DisplayName("Password")] 
    [DataType(DataType.Password)] 
    public string Password { get; set; } 
} 
public class NewUserViewModel 
{ 
    public User User { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    [DisplayName("Re-enter Password")] 
    [Compare("Password", ErrorMessage="Passwords must match")] 
    public string ComparePassword { get; set; } 
} 

"पासवर्ड" और "तुलनापास्वर्ड" के लिए जेनरेट किया गया HTML नीचे दिया गया है।

<input class="text-box single-line password" 
    data-val="true" 
    data-val-required="The Password field is required." 
    id="User_Password" 
    name="User.Password" 
    type="password" value="" /> 

<input class="text-box single-line password" 
    data-val="true" 
    data-val-equalto="Passwords must match" 
    data-val-equalto-other="*.Password" 
    data-val-required="The Re-enter Password field is required." 
    id="ComparePassword" 
    name="ComparePassword" 
    type="password" value="" /> 

कुंजी कैसे "डेटा-वैल-equalto-अन्य" जावास्क्रिप्ट द्वारा नियंत्रित किया जाता है। अगर मैं "पासवर्ड" या "उपयोगकर्ता_Password" कुछ भी नहीं होता है - कोई जांच नहीं की जाती है। अगर मैं "उपयोगकर्ता का उपयोग करता हूं। पासवर्ड" चेक किया जाता है लेकिन हमेशा विफल रहता है।

मुझे सीधे jQuery में ऐसा करने में कोई वास्तविक समस्या नहीं है, लेकिन यदि संभव हो तो [तुलना] विशेषता का उपयोग करना पसंद करेंगे।

+0

मैं ठीक उसी समस्या हो रही है (मैं FluentValidation का उपयोग कर रहा हूँ हालांकि समस्या समान दिखती है)। कोइ भाग्य? – Peter

+0

मैं वही काम कर रहा हूं और यह मेरे लिए काम नहीं कर रहा है। यह कहता है "[ViewModel] .User.Password" मौजूद नहीं है और फ़ॉर्म को प्रदर्शित करने से पहले रन टाइम त्रुटि फेंकता है। मेरे पास एक संपत्ति और पासवर्ड के रूप में उपयोगकर्ता के साथ एक स्ट्रिंग संपत्ति के रूप में एक दृश्य मॉडल है। कोई विचार? – vbullinger

उत्तर

14

बस StackOverflow और माइक्रोसॉफ्ट कनेक्ट के माध्यम से जवाब मिला:

देखें:

http://connect.microsoft.com/VisualStudio/feedback/details/665793/jquery-unobtrusive-validate-equalto-fails-with-compare-attribute और JQuery 1.5 breaks Compare Validate (JQuery Validate 1.8)

summerize के लिए, यह jquery.validate.unobtrusive फ़ाइल में एक बग की तरह लग रहा है कि एमवीसी 3 के साथ आया था। वर्कअराउंड jquery.validate.unobtrusive फ़ाइल में निम्न पंक्ति को बदल रहा है।

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

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

माइक्रोसॉफ्ट कनेक्ट पर करने के लिए है, यह कहना है एमएस यह तय किया है, लेकिन मैं नए संस्करण के लिए लिंक मिल सके। वैसे भी, यह इस दौरान मेरे लिए काम करता है। आशा है कि यह मदद करता है

+1

ने मेरा जीवन बचाया धन्यवाद। –

+2

हाय पीटर - मैंने आपके फिक्स की कोशिश की लेकिन यह मेरे लिए काम नहीं करता है। – Greg

+0

ऐसा लगता है जैसे माइक्रोसॉफ्ट ने आखिरकार इसे ठीक कर दिया है। मैंने jQuery को अद्यतन किया। प्रमाणीकरण पैकेज 1.9 से 1.9.0.1 तक और यह मेरे लिए काम करता है। –

2

मैं इस मुद्दे को दो क्षेत्रों का उपयोग कर और सर्वर पर की तुलना (विनीत जावास्क्रिप्ट के माध्यम से) तय:

[Required(ErrorMessage = @"The new password is required")] 
    [StringLength(25, ErrorMessage = @"The new password must be at least {2} characters long", MinimumLength = 4)] 
    [DataType(DataType.Password)] 
    [Display(Name = @"New Password")] 
    public string NewPassword { get; set; } 

    [Required(ErrorMessage = @"The confirmation of password is required")] 
    [StringLength(25, ErrorMessage = @"The confirmation of new password must be at least {2} characters long", MinimumLength = 4)] 
    [DataType(DataType.Password)] 
    [Display(Name = @"Confirm New Password")] 
    public string ConfirmPassword { get; set; } 

सर्वर साइड कोड:

[HttpPost] 
    public ViewResult ChangeUserPassword(ChangePasswordModel model) 
    { 
     Logger.Debug(LogBuilder.MethodEntry("ChangeUserPassword")); 

     if (model == null) 
     { 
      throw new ArgumentNullException("model"); 
     } 

     if (model.NewPassword != model.ConfirmPassword) 
     { 
      ModelState.AddModelError("", Messages.ConfirmPasswordError); 

      return View(model); 
     } 

     if (ModelState.IsValid) 
     { 
      var changePasswordCompleted = false; 

      try 
      { 
       var userName = CurrentPerson.UserDetails.UserName; 
       var membershipUser = Membership.GetUser(userName); 

       if (membershipUser != null) 
       { 
        changePasswordCompleted = membershipUser.ChangePassword(model.OldPassword, model.NewPassword); 
       } 
      } 
      catch (Exception exception) 
      { 
       changePasswordCompleted = false; 

       Logger.Error(LogBuilder.LogMethodError("ChangeUserPassword", exception)); 
      } 

      if (changePasswordCompleted) 
      { 
       return View("ChangePasswordCompleted"); 
      } 
     } 

     ModelState.AddModelError("", Messages.ChangePasswordError); 

     return View(model); 
    } 
संबंधित मुद्दे