Tôi nhận thấy đây là câu hỏi cũ nhưng muốn thêm một chút. Tôi thấy mình trong tình huống tương tự và dường như không có bất kỳ tài liệu/blog nào về chủ đề này. Tuy nhiên, tôi đã tìm ra cách để sử dụng nhà cung cấp tài nguyên tùy chỉnh, với một báo trước. Thông báo trước là tôi đang ở trong ứng dụng MVC nên tôi vẫn có sẵn HttpContext.GetLocalResourceObject()
. Đây là phương pháp mà asp.net sử dụng để bản địa hóa các mục. Việc thiếu đối tượng tài nguyên không ngăn bạn viết giải pháp riêng của chúng tôi, ngay cả khi đó là truy vấn trực tiếp của các bảng DB. Tuy nhiên, tôi nghĩ rằng nó là giá trị chỉ ra.
Mặc dù tôi không hài lòng với giải pháp sau, có vẻ như nó hoạt động. Đối với mỗi thuộc tính xác nhận tôi muốn sử dụng tôi kế thừa từ thuộc tính đã nói và quá tải IsValid(). Trang trí trông như thế này:
[RequiredLocalized(ErrorMessageResourceType= typeof(ClassBeginValidated), ErrorMessageResourceName="Errors.GenderRequired")]
public string FirstName { get; set; }
Thuộc tính mới trông như thế này:
public sealed class RequiredLocalized : RequiredAttribute {
public override bool IsValid(object value) {
if (! (ErrorMessageResourceType == null || String.IsNullOrWhiteSpace(ErrorMessageResourceName)) ) {
this.ErrorMessage = MVC_HtmlHelpers.Localize(this.ErrorMessageResourceType, this.ErrorMessageResourceName);
this.ErrorMessageResourceType = null;
this.ErrorMessageResourceName = null;
}
return base.IsValid(value);
}
}
Ghi chú
- Bạn cần phải trang trí mã của bạn với các thuộc tính có nguồn gốc, không tiêu chuẩn một
- Tôi đang sử dụng ErrorMessageResourceType để chuyển loại của lớp đang được xác thực. Điều đó có nghĩa là nếu tôi ở trong một lớp khách hàng và xác nhận tài sản FirstName tôi sẽ vượt qua loại (khách hàng). Tôi đang làm điều này bởi vì trong backend cơ sở dữ liệu của tôi, tôi đang sử dụng tên lớp đầy đủ (namespace + classname) làm khóa (giống như một URL trang được sử dụng trong asp.net).
- MVC_HtmlHelpers.Localize chỉ là một wrapper đơn giản để cung cấp tài nguyên tùy chỉnh của tôi
The (bán bị đánh cắp) mã helper trông như thế này ....
public static string Localize (System.Type theType, string resourceKey) {
return Localize (theType, resourceKey, null);
}
public static string Localize (System.Type theType, string resourceKey, params object[] args) {
string resource = (HttpContext.GetLocalResourceObject(theType.FullName, resourceKey) ?? string.Empty).ToString();
return mergeTokens(resource, args);
}
private static string mergeTokens(string resource, object[] args) {
if (resource != null && args != null && args.Length > 0) {
return string.Format(resource, args);
} else {
return resource;
}
}