2010-03-15 1 views
6

Tôi chỉ mới bắt đầu với ASP.NET MVC 2 và chơi xung quanh với Xác thực.Làm thế nào để xác thực hai thuộc tính với ASP.NET MVC 2

Hãy nói rằng tôi có 2 thuộc tính:

  • password1
  • password2

Và tôi muốn yêu cầu họ đều điền vào, và đòi hỏi rằng cả hai đều giống nhau trước khi mô hình hợp lệ.

Tôi có một lớp đơn giản được gọi là "Người dùng mới".

Tôi sẽ triển khai điều đó bằng cách nào? Tôi đã đọc về ValidationAttribute và hiểu điều đó. Nhưng tôi không thấy làm thế nào tôi sẽ sử dụng để thực hiện một xác nhận mà so sánh hai hoặc nhiều tài sản chống lại eathother.

Cảm ơn trước!

Vấn đề với bên dưới giải pháp:

Khi điều này được áp dụng cho một ứng dụng, và ModelBinder chạy xác nhận của mô hình, sau đó một vấn đề:

Nếu một Xác thực cấp thuộc tínhAttribute chứa lỗi, sau đó Xác thực cấp lớpAttributeNOT đã xác thực. Tôi chưa tìm được giải pháp cho vấn đề này.

Nếu bạn có giải pháp cho vấn đề này, vui lòng chia sẻ kinh nghiệm của bạn. Cảm ơn rất nhiều!

Trả lời

7

Mẫu ASP.NET MVC 2 mặc định của Visual Studio bao gồm thuộc tính xác thực chính xác mà bạn cần. Dán từ AccountModels.cs file:

[AttributeUsage(AttributeTargets.Class, 
    AllowMultiple = true, Inherited = true)] 
public sealed class PropertiesMustMatchAttribute : ValidationAttribute { 
    private const string _defaultErrorMessage = 
     "'{0}' and '{1}' do not match."; 
    private readonly object _typeId = new object(); 

    public PropertiesMustMatchAttribute(string originalProperty, 
     string confirmProperty) 
     : base(_defaultErrorMessage) { 
     OriginalProperty = originalProperty; 
     ConfirmProperty = confirmProperty; 
    } 

    public string ConfirmProperty { get; private set; } 
    public string OriginalProperty { get; private set; } 

    public override object TypeId { 
     get { 
      return _typeId; 
     } 
    } 

    public override string FormatErrorMessage(string name) { 
     return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, 
      OriginalProperty, ConfirmProperty); 
    } 

    public override bool IsValid(object value) { 
     PropertyDescriptorCollection properties = 
      TypeDescriptor.GetProperties(value); 
     object originalValue = properties.Find(OriginalProperty, 
      true /* ignoreCase */).GetValue(value); 
     object confirmValue = properties.Find(ConfirmProperty, 
      true /* ignoreCase */).GetValue(value); 
     return Object.Equals(originalValue, confirmValue); 
    } 
} 

Làm thế nào để sử dụng:

[PropertiesMustMatch("Password", "ConfirmPassword", 
    ErrorMessage = "The password and confirmation password do not match.")] 
class NewUser { 
    [Required] 
    [DataType(DataType.Password)] 
    [DisplayName("Password")] 
    public string Password { get; set; } 
    [Required] 
    [DataType(DataType.Password)] 
    [DisplayName("Confirm password")] 
    public string ConfirmPassword { get; set; } 
} 
+1

Vấn đề duy nhất tôi có thể thấy với điều này là, khi hai thuộc tính của Model (lớp trong trường hợp này), không bằng nhau, nó không biểu thị các thuộc tính cụ thể có chứa lỗi, giống như nó cho [Bắt buộc] và <% = Html.ValidationMessageFor (m => m.Password1)%> – CodeMonkey

+0

@CodeMonkey, tôi hiểu. Mặc dù tôi không chắc chắn nếu có một giải pháp thanh lịch để làm cho nó hoạt động theo cách khác, bằng cách sử dụng mô hình ràng buộc. Sau khi tất cả, điều này về mặt kỹ thuật là một xác nhận cấp lớp. Nếu bạn ** phải ** thêm các lỗi vào các thuộc tính thay vào đó, thì có thể kiểm tra hai giá trị trong bộ điều khiển sau khi ràng buộc sẽ là giải pháp nhanh nhất (mặc dù không phải là thanh lịch nhất). –

+0

Trong phiên bản MVC 2, phương thức trình trợ giúp Html.ValidationSummary giờ đây có thể hiển thị các lỗi chỉ ở mức Model-Level – murki