Tôi đang sử dụng MVC3 và tôi muốn có biểu mẫu Đăng nhập và biểu mẫu Đăng ký trên cùng một trang. Để đạt được điều đó tôi đã xây dựng LogInRegisterViewModel như sau:MVC3 So sánh Thuộc tính, lỗi phía máy khách
public class LogInRegisterViewModel
{
public LogInViewModel LogIn { get; set; }
public RegisterViewModel Register { get; set; }
}
Nó mang lại cho tôi những gì tôi muốn (hai hình thức trên cùng một màn hình) và đăng tải các dữ liệu để sửa chữa bộ điều khiển và trở về và hiển thị lỗi cho các hình thức (nếu có). Vấn đề duy nhất tôi có là với CompareAttribute mà tôi có trên tài sản ConfirmPassword trong RegisterViewModel tôi:
public class RegisterViewModel
{
[Required]
[Display(Name = "Friendly user name")]
public string UserName { get; set; }
[Required]
[Display(Name = "E-mail address")]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
[StringLength(16, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "Passwords do not match.")]
public string ConfirmPassword { get; set; }
}
Client-side các mật khẩu không bao giờ bằng nhau (~ Tôi luôn luôn nhận được một lỗi xác nhận từ so sánh với một thông điệp nói với tôi rằng họ không bằng nhau), ngay cả khi họ (tôi chắc chắn về điều đó). HTML trong trình duyệt là:
<div class="editor-label">
<label for="Register_Password">Password</label>
</div>
<div class="editor-field">
<input class="valid" data-val="true" data-val-length="The Password must be at least 6 characters long." data-val-length-max="16" data-val-length-min="6" data-val-required="The Password field is required." id="Register_Password" name="Register.Password" type="password">
<span class="field-validation-valid" data-valmsg-for="Register.Password" data-valmsg-replace="true"></span>
</div>
<div class="editor-label">
<label for="Register_ConfirmPassword">Confirm password</label>
</div>
<div class="editor-field">
<input class="input-validation-error" data-val="true" data-val-equalto="Passwords do not match." data-val-equalto-other="*.Password" id="Register_ConfirmPassword" name="Register.ConfirmPassword" type="password">
<span class="field-validation-error" data-valmsg-for="Register.ConfirmPassword" data-valmsg-replace="true"><span class="" generated="true" for="Register_ConfirmPassword">Passwords do not match.</span></span>
</div>
Tôi có một cảm giác rằng nó là tất cả về thuộc tính này: dữ liệu val-equalto-khác = "* Password"
CompareAttribute hoạt động tốt, khi tôi sử dụng RegisterViewModel trực tiếp. Bất cứ ai đã đi vào điều này trước? Nó là một lỗi hay tôi đang làm điều gì đó sai? Làm thế nào để so sánh để làm việc trong trường hợp của tôi?
Hoạt động như một sự quyến rũ, cảm ơn. –
Ngay cả bản sửa lỗi này cũng có lỗi của riêng nó. Javascript ".replace" chỉ thay thế phiên bản đầu tiên của "." và bỏ qua phần còn lại. Trong các mô hình phức tạp, bất kỳ tài sản nào có nhiều hơn một giai đoạn sẽ chịu chung số phận như mã ban đầu. Để khắc phục nó, bạn nên sử dụng: value = value.split ('.'). Join ('\\.'); –
@NickBork đẹp bắt :). Tôi đã cập nhật câu trả lời của mình. – nemesv