Voici mon exigence de développement,Retrieve le nom du modèle dans l'attribut nom d'affichage personnalisé
Mes valeurs d'étiquettes sont stockées dans la base de données, et je veux encore utiliser l'annotation de données de manière déclarative, est de rendre mon modèle plus lisible.
Et voici mon approche,
j'ai décidé d'écrire sur mesure DisplayNameAttribute, où la valeur par défaut fournie par mon modèle sera écrasé par la valeur récupérée à partir de la base de données.
Voici la propriété définie dans le modèle,
[CustomDisplay(Name: "First Name")]
[CustomRequired(ErrorMessage: "{0} is required")]
public String FirstName { get; set; }
Voici la classe d'attribut de nom d'affichage personnalisé,
public class CustomDisplayAttribute : DisplayNameAttribute
{
private string _defaultName;
private string _displayName;
public CustomDisplayAttribute(string Name)
{
_defaultName = Name;
}
public override string DisplayName
{
get
{
if (String.IsNullOrEmpty(_displayName))
{
_displayName = DAO.RetrieveValue(**ModelName**, _defaultName);
}
return _displayName;
}
}
}
Maintenant, vous pouvez voir dans le code ci-dessus, ModelName est quelque chose que je besoin, mais je n'ai pas !! Pendant le débogage, je creuse dans ModelMetadataProviders.Current et peut voir la disponibilité du modèle actuel en action. Mais, comme il fait partie de membres statiques non-publics, je suis incapable d'y accéder à travers mon code.
J'ai écrit la méthode ci-dessous pour récupérer le nom du modèle par la réflexion,
private static string GetModelName()
{
var modelName = String.Empty;
FieldInfo info = typeof(CachedAssociatedMetadataProvider<CachedDataAnnotationsModelMetadata>)
.GetField("_typeIds", BindingFlags.NonPublic | BindingFlags.Static);
var types = (ConcurrentDictionary<Type, string>)info.GetValue(null);
modelName = types.FirstOrDefault().Key.Name;
return modelName;
}
Mais le problème est, la collection types me fournit des entrées pour tous les modèles (visité au moins une fois par l'utilisateur). Et il n'y a pas d'indice à savoir, qui est actuellement en action !!