2010-02-01 18 views
7

Tôi đang sử dụng System.ComponontModel.DataAnnotations để xác thực đối tượng mô hình của mình. Làm thế nào tôi có thể thay thế các thông điệp thuộc tính tiêu chuẩn (Bắt buộc và StringLength) sản xuất mà không cung cấp thuộc tính ErrorMessage cho mỗi người trong số họ hoặc phụ phân loại chúng?Cách thay thế thông báo lỗi DataAnnotations chuẩn

Trả lời

8

Viết bài đăng mới vì tôi cần nhiều định dạng hơn so với nhận xét cung cấp.

Nhìn vào số ValidationAttribute - lớp cơ sở của thuộc tính xác thực.

Nếu xác nhận lỗi xảy ra, thông báo lỗi sẽ được tạo ra bằng phương pháp:

public virtual string FormatErrorMessage(string name) 
{ 
    return string.Format(CultureInfo.CurrentCulture, this.ErrorMessageString, new object[] { name }); 
} 

nhìn Next ở ErrorMessageString tài sản:

protected string ErrorMessageString 
{ 
    get 
    { 
     if (this._resourceModeAccessorIncomplete) 
     { 
      throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, DataAnnotationsResources.ValidationAttribute_NeedBothResourceTypeAndResourceName, new object[0])); 
     } 
     return this.ResourceAccessor(); 
    } 
} 

tài sản ResourceAccessor có thể được setted từ:

ValidationAttribute..ctor(Func<String>) 
ValidationAttribute.set_ErrorMessage(String) : Void 
ValidationAttribute.SetResourceAccessorByPropertyLookup() : Void 

Đầu tiên nó được sử dụng chính xác bởi các lớp dervided để định dạng tin nhắn, thứ hai - trường hợp khi chúng tôi thiết lập thông báo lỗi trough ErrorMessage tài sản, và thứ ba - khi chuỗi tài nguyên được sử dụng. Tùy thuộc vào trường hợp của bạn, bạn có thể sử dụng ErrorMessageResourceName.

Ở những nơi khác chúng ta hãy nhìn vào nhà xây dựng có nguồn gốc, ví dụ của chúng tôi, Thuộc tính phạm vi:

private RangeAttribute() 
    : base((Func<string>) (() => DataAnnotationsResources.RangeAttribute_ValidationError)) 
{ 
} 

Đây RangeAttribute_ValidationError được nạp từ nguồn:

internal static string RangeAttribute_ValidationError 
{ 
    get 
    { 
     return ResourceManager.GetString("RangeAttribute_ValidationError", resourceCulture); 
    } 
} 

Vì vậy, bạn có thể tạo tập tin tài nguyên cho tan khác nhau văn bản mặc định và ghi đè tin nhắn ở đó, như sau:

http://www.codeproject.com/KB/aspnet/SatelliteAssemblies.aspx

http://msdn.microsoft.com/en-us/library/aa645513(VS.71).aspx

+0

Cảm ơn rất nhiều Veton. Phần cuối cùng bạn đã đề cập tôi đã hoàn toàn bỏ qua. –

+6

Tôi không thể hiểu làm thế nào nên các tập tin tài nguyên được đặt tên (và nơi được đặt) để ghi đè ResourceManager từ DataAnnotations.dll. – wRAR

6

Bạn có thể sử dụng ErrorMessage tài sản của lớp cơ sở ValidationAttribute cho tất cả các xác nhận DataAnnotations.

Ví dụ:

[Range(0, 100, ErrorMessage = "Value for {0} must be between {1} and {2}")] 
public int id; 

Có lẽ nó sẽ giúp.

+3

True. Nhưng có cách nào để thay thế tin nhắn mặc định cùng một lúc không? –

+1

@FitzchakYitzchaki Bạn đã bao giờ đạt được điều đó chưa? –

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