2012-04-25 27 views
8

Khi bạn trang trí thuộc tính của đối tượng mô hình với thuộc tính Required và không chỉ định ErrorMessage hoặc ResourceType/Name, bạn nhận được thông báo xác thực ở dạng nội suy của trường "{0} là bắt buộc", trong đó thông số 0 là giá trị của DisplayName thuộc tính của thuộc tính đó.MVC3: Cách thay đổi văn bản thông báo xác thực [Bắt buộc] chung?

Tôi muốn thay đổi chuỗi mặc định đó thành một thứ khác nhưng tôi muốn giữ nguyên bản chất chung của nó, đó là tôi không muốn chỉ định ErrorMessage hoặc ResourceType/Name cho mọi thuộc tính của đối tượng mô hình. Chuỗi mặc định được lưu trữ ở đâu và làm cách nào để thay đổi?

Trả lời

6

Thu được thuộc tính của riêng bạn là một lựa chọn hợp lý và có lẽ có phí thấp nhất để bắt đầu, nhưng bạn sẽ cần phải quay trở lại và thay đổi tất cả sử dụng hiện tại của bạn của [Required]. Bạn (và bất kỳ người nào khác trong nhóm của bạn) cũng sẽ cần phải nhớ sử dụng (và dạy người mới sử dụng) một trong những quyền đi về phía trước.

Cách khác là thay thế ModelMetadataProvidersModelValidatorProviders để trả lại chuỗi từ tệp tài nguyên. Điều này tránh được những hạn chế ở trên. Nó cũng đặt nền móng cho việc thay thế các thông điệp cho các thuộc tính khác (ví dụ: MaxLengthAttribute) và để hỗ trợ các ngôn ngữ bổ sung.

protected void Application_Start() 
{ 
    var stringProvider = new ResourceStringProvider(Resources.LocalizedStrings.ResourceManager); 
    ModelMetadataProviders.Current = new LocalizedModelMetadataProvider(stringProvider); 
    ModelValidatorProviders.Providers.Clear(); 
    ModelValidatorProviders.Providers.Add(new LocalizedModelValidatorProvider(stringProvider)); 
} 

Dưới đây là toàn source, documentation, và một blog post mô tả việc sử dụng.

6

Bạn đã thử tạo một lớp dẫn xuất của RequiredAttribute và ghi đè phương thức FormatErrorMessage chưa? Điều này sẽ làm việc:

public class MyRequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute 
{ 
    public override string FormatErrorMessage(string name) 
    { 
     return base.FormatErrorMessage(string.Format("This is my error for {0}", name)); 
    } 
} 
+0

Có, nhưng tôi nên đọc thuộc tính siêu dữ liệu 'DisplayName' trong hàm tạo MyRequiredAttribute' (thay vì truyền nó một cách rõ ràng), vì tôi đã có/cần DisplayName được định nghĩa. –

+1

Theo liên kết bên dưới, tham số 'tên' là tên được bao gồm trong thư được định dạng.http: //msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute.formaterrormessage. aspx – Joshua

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