Me doy cuenta de que esta es una pregunta antigua, pero quería agregar un poco. Me encontré en la misma situación y no parece haber documentación/blogumentación sobre este tema. Sin embargo, descubrí una forma de utilizar un proveedor de recursos personalizado, con una advertencia. La advertencia es que estoy en una aplicación MVC, así que todavía tengo HttpContext.GetLocalResourceObject()
disponible. Este es el método que usa asp.net para localizar artículos. La ausencia del objeto recurso no le impide escribir nuestra propia solución, incluso si es una consulta directa de las tablas DB. Sin embargo, pensé que valía la pena señalarlo.
Si bien no estoy muy contento con la siguiente solución, parece que funciona. Para cada atributo de validación que quiero usar, heredo de dicho atributo y sobrecargo el IsValid(). La decoración se ve así:
[RequiredLocalized(ErrorMessageResourceType= typeof(ClassBeginValidated), ErrorMessageResourceName="Errors.GenderRequired")]
public string FirstName { get; set; }
El nuevo atributo tiene el siguiente aspecto:
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);
}
}
Notas
- lo necesario para decorar su código con el atributo derivado, no la norma uno
- Estoy usando ErrorMessageResourceType para pasar el tipo de la clase que se está validando. Con esto me refiero a si estoy en una clase de cliente y validando la propiedad FirstName pasaría typeof (cliente). Lo hago porque en el back-end de mi base de datos estoy usando el nombre completo de la clase (namespace + classname) como clave (de la misma manera que se usa una URL de página en asp.net).
- MVC_HtmlHelpers.Localize es sólo un envoltorio sencillo para el profesional del recurso personalizado
El código auxiliar (semi-robo) se parece a esto ....
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;
}
}