2011-07-25 9 views
17

Tôi muốn tạo mô hình chế độ xem cho người dùng mới bằng cách sử dụng mã bên dưới. Lớp "Người dùng" chỉ chứa hai thuộc tính (được đơn giản hóa bây giờ) mà tôi sẽ tiếp tục tồn tại trong cơ sở dữ liệu; mô hình khung nhìn thêm trường "so sánh mật khẩu", chỉ được sử dụng trong chế độ xem. Tôi muốn có mô hình xem sử dụng trực tiếp lớp "Người dùng", thay vì lặp lại tất cả các trường được xác định trong "Người dùng".So sánh (mật khẩu) thuộc tính

Câu hỏi của tôi là cách tôi tham chiếu chính xác "User.Password" trong thuộc tính [So sánh] cho trường "ComparePassword"?

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 được tạo cho "Mật khẩu" và "ComparePassword" ở bên dưới.

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

Điều quan trọng là như thế nào "dữ liệu val-equalto-khác" được xử lý bởi Javascript. Nếu tôi sử dụng "Mật khẩu" hoặc "User_Password" thì không có gì xảy ra - không có kiểm tra nào được thực hiện. Nếu tôi sử dụng "User.Password", việc kiểm tra được thực hiện nhưng luôn thất bại.

Tôi không có vấn đề thực sự nào khi thực hiện việc này trực tiếp trong jQuery, nhưng muốn sử dụng thuộc tính [So sánh] nếu có thể.

+0

Tôi gặp vấn đề chính xác cùng (tôi đang sử dụng FluentValidation mặc dù vấn đề có vẻ giống hệt nhau). Bất kỳ may mắn? – Peter

+0

Tôi đang làm điều tương tự và điều này không hiệu quả đối với tôi. Nó nói "[ViewModel] .User.Password" không tồn tại và ném một lỗi thời gian chạy trước khi biểu mẫu hiển thị. Tôi có một mô hình xem với người dùng như một tài sản và mật khẩu như là một tài sản chuỗi bên dưới nó. Bất kỳ ý tưởng? – vbullinger

Trả lời

14

Chỉ cần tìm thấy câu trả lời qua StackOverflow và Microsoft Connect:

Xem:

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

Để summerize, nó trông giống như một lỗi trong các tập tin jquery.validate.unobtrusive rằng đi kèm với MVC3. Cách giải quyết thay đổi dòng sau trong tệp jquery.validate.unobtrusive.

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

để

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

Trên Microsoft Connect, nó nói MS đã cố định nó, nhưng tôi couldnt tìm liên kết lên phiên bản mới. Dù sao, điều này làm việc cho tôi trong khi chờ đợi. Hy vọng nó giúp

+1

đã cứu mạng tôi. –

+2

Xin chào Peter - Tôi đã thử bản sửa lỗi của bạn nhưng nó không hiệu quả với tôi. – Greg

+0

Có vẻ như Microsoft cuối cùng đã sửa nó. Tôi cập nhật gói jQuery.Validation từ 1.9 lên 1.9.0.1 và nó hoạt động cho tôi. –

2

Tôi cố định vấn đề này sử dụng hai lĩnh vực và so sánh trên máy chủ (thông qua phô trương JavaScript):

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

server-side code:

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