2010-05-11 38 views
15

Với các lớp học sau:Thông báo lỗi cho mô hình xác nhận sử dụng chú thích dữ liệu

using System.ComponentModel.DataAnnotations; 

public class Book{ 
    public Contact PrimaryContact{get; set;} 
    public Contact SecondaryContact{get; set;} 

    [Required(ErrorMessage="Book name is required")] 
    public string Name{get; set;} 
} 
public class Contact{ 
    [Required(ErrorMessage="Name is required")] 
    public string Name{get; set;} 
} 

Có cách nào sạch tôi có thể cung cấp cho một thông báo lỗi khác nhau cho mỗi trường hợp của Contact trong Book sử dụng DataAnnotations? Ví dụ: nếu tên bị thiếu trong trường hợp PrimaryContact, lỗi sẽ đọc "tên liên hệ chính là bắt buộc".

Giải pháp hiện tại của tôi là tạo dịch vụ xác thực kiểm tra trạng thái mô hình cho các lỗi trường, sau đó xóa các lỗi đã nói và thêm lại chúng bằng ngôn ngữ cụ thể mà tôi muốn.

Trả lời

28

Đây là cách duy nhất tôi biết về điều đó, nhưng nó cách xa sạch sẽ. Nó liên quan đến việc sử dụng các lớp con và lớp MetaData để "ghi đè" thông báo lỗi.

public class Book 
{ 
    public PrimaryContact PrimaryContact { get; set; } 
    public SecondaryContact SecondaryContact { get; set; } 

    [Required(ErrorMessage = "Book name is required")] 
    public string Name { get; set; } 
} 

public class Contact 
{ 
    [Required(ErrorMessage = "Name is required")] 
    public string Name { get; set; } 
} 

[MetadataType(typeof(PrimaryContactMD))] 
public class PrimaryContact : Contact 
{ 
    class PrimaryContactMD 
    { 
     [Required(ErrorMessage = "Primary Contact Name is required")] 
     public string Name { get; set; } 
    } 
} 

[MetadataType(typeof(SecondaryContactMD))] 
public class SecondaryContact : Contact 
{ 
    class SecondaryContactMD 
    { 
     [Required(ErrorMessage = "Secondary Contact Name is required")] 
     public string Name { get; set; } 
    } 
} 
1

Tôi cũng đang tìm câu trả lời cho điều này, những gì tôi đã tìm thấy biến. Tôi con số đó là một cách để sử dụng một cách rõ ràng tính năng này.

9

Tôi hiểu điều này là cũ, nhưng vì lợi ích của việc giúp đỡ những người khác chạy vào vấn đề này và vấp ngã về câu hỏi này như tôi đã làm, bạn có thể muốn xem xét việc sử dụng CustomValidation thuộc tính cho tài sản đó thay vì dựa vào các Required thuộc tính.

CustomValidation sẽ cho phép bạn chỉnh sửa chi tiết hơn thông điệp xác thực của bạn tới thuộc tính bạn đang xác thực. Tôi đã sử dụng context.DisplayName để tự động hiển thị tên của thuộc tính đang được xác thực chỉ trong thời gian ngắn, nhưng điều này có thể được tùy chỉnh thêm dựa trên nhu cầu của bạn.

Nếu cần thêm tùy chỉnh nữa, bạn có thể viết các trình xử lý CustomValidation khác nhau cho mỗi thuộc tính riêng lẻ thay vì chỉ sử dụng lại một cách giống như tôi đã làm trong ví dụ mã của mình.

using System.ComponentModel.DataAnnotations; 

public class Book { 
    [CustomValidation(typeof(Book), "ValidateContact")] 
    public Contact PrimaryContact { get; set; } 

    [CustomValidation(typeof(Book), "ValidateContact")] 
    public Contact SecondaryContact { get; set; } 

    [Required(ErrorMessage = "Book name is required")] 
    public string Name { get; set; } 

    public static ValidationResult ValidateContact(Contact contact, ValidationContext context) { 
     ValidationResult result = null; 

     if (contact == null) { 
      result = new ValidationResult(string.Format("{0} is required.", context.DisplayName)); 
     } else if (string.IsNullOrWhiteSpace(contact.Name)) { 
      result = new ValidationResult(string.Format("{0} name is required.", context.DisplayName)); 
     } 

     return result; 
    } 
} 

public class Contact { 
    [Required(ErrorMessage = "Name is required")] 
    public string Name { get; set; } 
} 
Các vấn đề liên quan