2010-12-06 63 views
2

Bonne journée!Modifier la valeur par défaut "Le champ {0} est requis" (solution ultime?)

J'ai la classe ViewModel suivante, je l'utilise pour le formulaire de connexion:

using System.ComponentModel.DataAnnotations; 

... 

public class UserLogin : IDataErrorInfo 
{   
    [Required] 
    [DisplayName("Login")] 
    public string Login { get; set; } 

    [Required] 
    [DisplayName("Password")] 
    public string Password { get; set; } 

    [DisplayName("Remember Me")] 
    public bool RememberMe { get; set; } 

    #region IDataErrorInfo Members 

    // This will be a Model-level error 
    public string Error 
    { 
     get 
     { 
      if (!WebUser.CanLogin(Login, Password)) 
      { 
       return Resources.ValidationErrors.InvalidLoginPassword; 
      } 
      else 
      { 
       return String.Empty; 
      } 
     } 
    } 

    // All is handled by DataAnnotation attributes, just a stub for interface 
    public string this[string columnName] 
    { 
     get 
     { 
      return string.Empty; 
     } 
    } 
    #endregion 

} 

Et ceci Global.asax:

DefaultModelBinder.ResourceClassKey = "BinderMessages"; 
ValidationExtensions.ResourceClassKey = "BinderMessages"; 

Le fichier de ressources BinderMessages.resx est placé à l'intérieur App_GlobalResources il a deux touches InvalidPropertyValue (qui fonctionne) et PropertyValueRequired qui ne fonctionne pas et me donne un message par défaut.

Question: Est-il possible de modifier ce message, ou est-il lié à DataAnnotations?

J'ai trouvé beaucoup de messages à ce sujet, mais sans solution. Pour l'instant je viens REPLI à ceci:

[Required(ErrorMessageResourceType = typeof(Resources.ValidationErrors), ErrorMessageResourceName = "Required")] 
+0

Le problème reste cependant, est ce que si vous avez laissé Login et Mot de passe vide? Le programme abandonne avec l'objet non défini. – Fandango68

+0

Pourquoi le pensez-vous? Le classeur modèle va instancier une instance d'objet 'UserLogin' de toute façon. – artvolk

+0

Presque 5 ans et semble toujours pas applicable. Il n'y a toujours que 4 clés qui peuvent être utilisées dans le fichier de ressources défini dans 'global.asax' – mcy

Répondre

6

Vous pouvez créer une ValidationAttribute qui étend RequiredAttribute et définit les valeurs là. Quelque chose comme:

public class MyRequiredAttribute : RequiredAttribute 
{ 
    public MyRequiredAttribute() 
    { 
     ErrorMessageResourceType = typeof(Resources.ValidationErrors); 
     ErrorMessageResourceName = "Required"; 
    } 
} 

décorer ensuite votre modèle avec votre attribut personnalisé.

Le message par défaut est compilé dans l'assembly DataAnnotations dans le fichier de ressources sous System.ComponentModel.DataAnnotations.Resources.DataAnnotationsResources.resources et est RequiredAttribute_ValidationError=The {0} field is required.. Donc, pour répondre à votre question, oui, ce message fait partie de DataAnnotations.

Modifier: PropertyValueRequired est utilisé pour les erreurs sur les valeurs null avec des types non nullable. Comme mentionné ci-dessous PropertyValueInvalid est utilisé pour les erreurs de conversion de type.

+0

Merci pour la réponse, c'est une bien meilleure solution que la mienne (voulez-vous vraiment dire 'ActionFilterAttribute' et non l'attribut d'annotation de données?) . Est-il possible de savoir pourquoi ça ne marche pas? – artvolk

+0

Oups, oui. Désolé pour ça. Je voulais dire ValidationAttribute. Édité. – bmancini

+0

Petite note: 'InvalidPropertyValue' est appelée lorsqu'elle ne parvient pas à lier des valeurs aux champs d'objet (erreurs de conversion), par exemple - lorsqu'elle ne peut pas lier la valeur de chaîne au champ de modèle int, cela se produit avant la validation. – artvolk

1

J'ai fait une approche en utilisant une classe singleton pour fournir les traductions. Vous devez toujours dériver tous les attributs comme suggéré par @bmancini. L'avantage de mon approche est que vous pouvez utiliser plusieurs tables de chaînes (ou changer de source de traduction) sans avoir à modifier aucune autre logique.

Depuis mon entrée de blog est assez grand, je vais simplement fournir un lien: http://blog.gauffin.org/2010/11/simplified-localization-for-dataannotations/