Я понимаю, что это старый вопрос, но хотелось добавить немного. Я оказался в той же ситуации и, похоже, не было никакой документации/блогации по этой теме. Тем не менее, я выяснил способ использования специализированного поставщика ресурсов с одной оговоркой. Предостережение в том, что я в приложении MVC, поэтому у меня все еще есть HttpContext.GetLocalResourceObject()
. Это метод, который использует asp.net для локализации элементов. Отсутствие ресурсного объекта не мешает вам писать собственное решение, даже если оно является прямым запросом таблиц БД. Тем не менее, я думал, что стоит отметить.
Хотя я не очень доволен следующим решением, он, похоже, работает. Для каждого атрибута проверки я хочу использовать наследование у указанного атрибута и перегрузить IsValid(). Украшение выглядит следующим образом:
[RequiredLocalized(ErrorMessageResourceType= typeof(ClassBeginValidated), ErrorMessageResourceName="Errors.GenderRequired")]
public string FirstName { get; set; }
новый атрибут выглядит следующим образом:
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);
}
}
Примечание
- Вы должны украсить свой код с производным атрибутом, а не стандартным один
- Я использую ErrorMessageResourceType, чтобы передать тип проверяемого класса. Под этим я имею в виду, если бы я был в классе клиента и проверял свойство FirstName, я бы передал typeof (customer). Я делаю это, потому что в моей базе данных базы данных я использую полное имя класса (namespace + classname) в качестве ключа (так же, как URL-адрес страницы используется в asp.net).
- MVC_HtmlHelpers.Localize это простая оболочка для моего пользовательского поставщика ресурсов
(пол-украдено) вспомогательный код выглядит следующим образом ....
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;
}
}