Я понимаю, что это старый вопрос, но хотел бы добавить немного. Я попал в ту же ситуацию, и по этой теме нет документации / блогов. Тем не менее, я нашел способ использовать собственный поставщик ресурсов с одним предупреждением. Предостережение в том, что я нахожусь в приложении 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;
}
}