5

Je voudrais utiliser DataAnnotations dans mon application ASP.NET MVC. Je suis fortement typé classe de ressources et je voudrais définir dans mes modèles de vue:Est-il possible d'utiliser des annotations de données pour LabelFor, ValidationMessageFor, EditorFor avec des ressources fortement typées?

[DisplayName(CTRes.UserName)] 
string Username; 

CTRes est ma ressource, classe générée automatiquement. La définition ci-dessus n'est pas autorisée. Y a-t-il d'autres solutions?

Répondre

0

Les attributs ne peuvent le faire

voir C# attribute text from resource file?

Resource.ResourceName serait une propriété de chaîne, attribuer les paramètres ne peuvent être constantes, énumérations, typeofs

7

Il y a le DisplayAttribute qui a été ajouté dans la version 4.0 .NET qui vous permet de spécifier une chaîne de ressource:

[Display(Name = "UsernameField")] 
string Username; 

Si vous ne pouvez pas utiliser 4.0 .NET mais vous pouvez écrire votre propre attribut:

public class DisplayAttribute : DisplayNameAttribute 
{ 
    public DisplayAttribute(Type resourceManagerProvider, string resourceKey) 
     : base(LookupResource(resourceManagerProvider, resourceKey)) 
    { 
    } 

    private static string LookupResource(Type resourceManagerProvider, string resourceKey) 
    { 
     var properties = resourceManagerProvider.GetProperties(
      BindingFlags.Static | BindingFlags.NonPublic); 

     foreach (var staticProperty in properties) 
     { 
      if (staticProperty.PropertyType == typeof(ResourceManager)) 
      { 
       var resourceManager = (ResourceManager)staticProperty 
        .GetValue(null, null); 
       return resourceManager.GetString(resourceKey); 
      } 
     } 
     return resourceKey; 
    } 
} 

que vous pouvez utiliser comme ceci:

[Display(typeof(Resources.Resource), "UsernameField"), 
string Username { get; set; } 
+1

Cela ne permet pas d'utiliser * * fortement ** ressources typées. DisplayNameAttribute était un mauvais exemple, car il ne permet pas d'utiliser aussi faiblement typé :) Ma question ne concerne pas DisplayName ne permettant pas d'utiliser des ressources, car, comme vous avez répondu, cela peut être facilement géré. Ma question est de les utiliser ** fortement typés ** et non seulement avec cet attribut, mais avec chaque attribut dans DataAnnotations. – LukLed

+0

Ceci devrait être la réponse acceptée à la question "Y a-t-il d'autres solutions?". La réponse acceptée actuellement est simplement "Non vous ne pouvez pas" –

0

cela fonctionne maintenant comme il se doit dans MVC3, comme mentionné sur ScottGu's post, et vous permettrait d'utiliser le DisplayAttribute intégré avec un fichier de ressources localisé.

+0

:) Ce n'est pas ce dont j'ai besoin. Lorsque j'ai écrit cette question, je n'ai pas remarqué que l'attribut DisplayName ne prend aucune ressource. Ce que je veux vraiment utiliser est ** strong ** ('ResourceClass.ResourceName') tapé resouces avec tous les attributs. – LukLed