Mi rendo conto che questa è una domanda vecchia, ma volevo aggiungere un po '. Mi sono trovato nella stessa situazione e non sembra esserci alcuna documentazione/blogumentation su questo argomento. Tuttavia, ho trovato un modo per utilizzare un fornitore di risorse personalizzate, con un avvertimento. L'avvertenza è che sono in un'applicazione MVC quindi ho ancora HttpContext.GetLocalResourceObject()
disponibile. Questo è il metodo che asp.net usa per localizzare gli oggetti. L'assenza dell'oggetto risorsa non ti impedisce di scrivere la nostra soluzione, anche se è una query diretta delle tabelle DB. Tuttavia, ho pensato che valesse la pena segnalarlo.
Anche se non sono molto contento della seguente soluzione, sembra funzionare. Per ogni attributo di convalida che voglio utilizzare, eredito da detto attributo e sovraccarico IsValid(). La decorazione è simile al seguente:
[RequiredLocalized(ErrorMessageResourceType= typeof(ClassBeginValidated), ErrorMessageResourceName="Errors.GenderRequired")]
public string FirstName { get; set; }
Il nuovo attributo assomiglia a questo:
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);
}
}
Note
- Hai bisogno di decorare il vostro codice con l'attributo derivato, non lo standard one
- Sto utilizzando ErrorMessageResourceType per passare il tipo della classe da convalidare. Con questo intendo che se sono in una classe cliente e convalida la proprietà FirstName, passerò a tipoof (cliente). Lo sto facendo perché nel backend del mio database sto usando il nome completo della classe (namespace + classname) come chiave (allo stesso modo in cui un URL della pagina è usato in asp.net).
- MVC_HtmlHelpers.Localize è solo un semplice wrapper per il mio fornitore di risorsa personalizzata
Il codice helper (semi-rubato) si presenta così ....
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;
}
}