2010-08-24 30 views
18

Tôi có một cái gì đó như thế này:làm thế nào để đưa DisplayName trên định dạng ErrorMessage

[DisplayName("First Name")] 
    [Required(ErrorMessage="{0} is required.")] 
    [StringLength(50, MinimumLength = 10, ErrorMessage="{0}'s length should be between {2} and {1}.")] 
    public string Name { get; set; } 

Tôi muốn có kết quả như sau:

  • Tên là bắt buộc. chiều dài
  • Tên của nên được giữa 10 và 50.

Nó đang làm việc khi sử dụng ASP.NET MVC2 Lỗi Tóm tắt, nhưng khi tôi cố gắng để xác nhận nó bằng tay, như thế này:

 ValidationContext context = new ValidationContext(myModel, null, null); 
     List<ValidationResult> results = new List<ValidationResult>(); 
     bool valid = Validator.TryValidateObject(myModel, context, results, true); 

Kết quả là:

  • Tên là bắt buộc.
  • Độ dài của tên phải nằm trong khoảng từ 10 đến 50.

Có vấn đề gì? Cảm ơn.

+0

tôi dường như có cùng một vấn đề như OP. Trong chính, sử dụng [DisplayName] hoặc [Display] trên thuộc tính hoạt động chính xác (thay thế {0} trong thông báo lỗi của thuộc tính bắt buộc bằng tên hiển thị), tuy nhiên tôi đã phát hiện ra rằng lỗi đầu ra của mô hình bằng xác thực phía máy chủ không chính xác (thay thế {0} bằng tên thuộc tính) - mặc dù xác thực không phô trương cung cấp giá trị chính xác cho cùng một thuộc tính. (Để thấy điều này tôi phải tắt javascript). Tôi vẫn chưa thể đi đến đáy của điều này - quan sát với MVC 5.2.3 –

Trả lời

9

Vâng, tôi nghĩ tôi đã làm được.

tôi phải tạo ra một thuộc tính như thế này:

public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute 
{ 
    private String displayName; 

    public RequiredAttribute() 
    { 
     this.ErrorMessage = "{0} is required"; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     var attributes = validationContext.ObjectType.GetProperty(validationContext.MemberName).GetCustomAttributes(typeof(DisplayNameAttribute), true); 
     if (attributes != null) 
      this.displayName = (attributes[0] as DisplayNameAttribute).DisplayName; 
     else 
      this.displayName = validationContext.DisplayName; 

     return base.IsValid(value, validationContext); 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return string.Format(this.ErrorMessageString, displayName); 
    } 
} 

Và mô hình của tôi là:

[DisplayName("Full name")] 
    [Required] 
    public string Name { get; set; } 

Rất may DataAnnotation này là mở rộng.

+1

Điều này làm thay đổi hành vi của cách các thẻ bắt buộc được hiển thị. Tôi sẽ cố gắng theo dõi một giải pháp không ảnh hưởng đến cách khung thực thể xác thực phía khách hàng khi tôi có thêm thời gian để xác minh nó đáp ứng nhu cầu ban đầu của câu hỏi này. –

28

Thay vì (hoặc có thể kết hợp với) sử dụng thuộc tính [DisplayName], hãy sử dụng thuộc tính [Display] trong System.ComponentModel.DataAnnotations. Điền vào thuộc tính Name của nó.

Với điều đó, bạn có thể sử dụng thuộc tính xác thực được tích hợp sẵn hoặc thuộc tính tùy chỉnh với ValidationContext 's DisplayName.

ví dụ

[Display(Name="First Name")] // <-- Here 
[Required(ErrorMessage="{0} is required.")] 
[StringLength(50, MinimumLength = 10, ErrorMessage="{0}'s length should be between {2} and {1}.")] 
public string Name { get; set; } 
+0

Tuyệt vời ... bạn đã lưu ngày của tôi. Bạn lấy thông tin này ở đâu? – developer

+1

Xin lỗi, tôi không có hồi ức. [Nguồn mất trí nhớ] (https://en.wikipedia.org/wiki/Source_amnesia) tấn công một lần nữa. Tôi vẫn có thể nói với sự tự tin tuyệt vời mà tôi đã không đọc nó từ tài liệu MSDN. – Sorensen

Các vấn đề liên quan