2011-07-25 25 views
17

Aşağıdaki kodu kullanarak yeni bir kullanıcı için bir görünüm modeli oluşturmak istiyorum. "Kullanıcı" sınıfı, veritabanına devam edeceğim sadece iki özelliği (şimdilik basitleştirilmiş) içerir; görünüm modeli, yalnızca görünümde kullanılan "şifre karşılaştır" alanını ekler. Görünüm modelinin "Kullanıcı" bölümünde tanımlanan tüm alanları tekrarlamak yerine "Kullanıcı" sınıfını doğrudan kullanmasını tercih ederim.Karşılaştırın (password) nitelik

Sorum, "ComparePassword" alanının [Compare] özelliğindeki "User.Password" konusuna nasıl düzgün bir şekilde başvuruda bulunabilirim?

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

"Parola" ve "ComparePassword" için oluşturulan HTML aşağıdadır.

<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="" /> 

anahtarı "veri val-equalto-Diğer" Javascript tarafından işlendiğini nasıl. "Parola" veya "User_Password" işlevlerini kullanmazsam hiçbir şey yapılmaz - hiçbir denetim gerçekleştirilmez. "User.Password" kullanırsam, kontrol gerçekleştirilir, ancak her zaman başarısız olur.

Doğrudan jQuery'de bununla ilgili gerçek bir sorunum yok, ancak mümkünse [Compare] özelliğini kullanmayı tercih ediyorum.

+0

Ben aynı sorunu yaşıyorum (Sorun aynı görünmekle birlikte FluentValidation kullanıyorum). Şansın var mı? – Peter

+0

Ben aynı şeyi yapıyorum ve bu benim için çalışmıyor. "[ViewModel] .User.Password" mevcut değil ve formun görüntülenmesinden önce bir çalışma zamanı hatası atar. Altında bir özellik ve parola olarak kullanıcı ile bir Görünüm Modeli var. Herhangi bir fikir? – vbullinger

cevap

14

Sadece StackOverflow ve Microsoft Connect aracılığıyla cevap buldu:

bakın

:

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

summerize için, jquery.validate.unobtrusive dosyasında bir hata gibi görünüyor MVC3 ile geldi. Geçici çözüm, jquery.validate.unobtrusive dosyasında aşağıdaki satırı değiştiriyor.

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

Microsoft Connect üzerinde

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

için, MS düzelttim getirdiğini, ancak ben yeni sürümüne bağlantı bulamadı. Her neyse, bu arada benim için çalışıyor. o

+1

hayatımı kurtardı teşekkürler. –

+2

Merhaba Peter - Fikrini denedim ama işe yaramıyor. – Greg

+0

Microsoft'un nihayetinde tamir ettiği anlaşılıyor. JQuery.Validation paketini 1.9'dan 1.9.0.1'e güncelledim ve benim için çalışıyor. –

2

ben bu sorunu (göze batmayan JavaScript aracılığıyla) iki alanlarını kullanarak ve sunucuda karşılaştırarak sabit olur Umut:

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

Sunucu tarafı kodu:

[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); 
    }