2010-10-19 4 views
7

Je suis assez nouveau à asp.net mvc, et je sais juste que je suis en train de trouver une bonne pratique pour faire la validation des entrées.asp.net mvc entrée/validation du modèle multi-langue

Dans le projet, nous allons utiliser le cadre de l'entité, où vous pouvez ajouter annotations de données à des propriétés de la manière suivante:

[Required(ErrorMessage = "Please enter a product name")] 
[Column] 
public string Name { get; set; } 

Ceci est assez agréable, mais nous avons un site web en plusieurs langues (comme la plupart des sites Web), afin que nous puissions non seulement afficher les messages d'erreur en anglais. Qu'est-ce qui peut être un moyen de résoudre ce problème? Puis-je modifier cet errormessage @runtime, en fonction de la langue de l'utilisateur? Dois-je utiliser la validation côté client Jquery?

Merci pour l'entrée.

Mise à jour J'ai essayé le code sur le site de Phil Haack Cela fera l'affaire avec des ressources statiques cependant, nous utilisons des ressources qui proviennent d'une base de données et non des ressources statiques.

Si je remplir les champs suivants pour les DataAnnotations:

[MetadataType(typeof(IncidentsMetaData))] 
public partial class INCIDENTS 
{ 
    private class IncidentsMetaData 
    { 
     [Required(ErrorMessageResourceType = typeof(CustomResourceProviders.DBResourceProviderFactory), 
      ErrorMessageResourceName="1277")] 
     public string SUBJECT { get; set; } 
    } 
} 

Puis-je obtenir l'erreur suivante: Le type de ressource « CustomResourceProviders.DBResourceProviderFactory » ne sont pas une propriété statique accessible nommé « 1277 ».

Bien sûr, il n'y a pas une telle propriété, il devrait être accessible par une fonction. Une idée de ce que je pourrais faire à ce sujet? tnx

Répondre

2

Phil Haack a écrit un good blog post qui explique comment procéder. Essentiellement, c'est à peu près la même chose, sauf que vous utilisez des fichiers de ressources pour fournir les messages.

[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = Required")] 
public string MyProperty{ get; set; } 
+0

Merci pour la réponse. – denappel

+0

J'ai édité la question, parce que bien que la réponse soit utile, elle ne résout pas complètement mon problème – denappel

+0

Trouvez-vous la solution, j'ai couru dans le même problème que vous –

8

Vous pouvez hériter attribut personnalisé de RequiredAttribute et de définir votre propre message localisé pour la propriété ErrorMessage. Il peut ressemble à ceci:

public class LocalizedRequiredAttribute : RequiredAttribute 
{ 
    public LocalizedRequiredAttribute() 
     : base() 
    { 
     // prefix for the selection of localized messages from datebase 
     // e.x. for "Required" string, localized messages will be: "RuRequired", "EnRequired" 
     var currentCulture = CultureInfo.CurrentCulture.TwoLetterISOLanguageName; 

     // logic to get value from datebase 
     // e.x. using Linq2Sql 
     using (var context = new dateBaseContext()) 
     { 
      var query = (from x in context.LocalizedStrings 
         where x.NameKey == currentCulture + "Required" 
         select x.NameValue).SingleOrDefault(); 

      if (query != null) 
      { 
       base.ErrorMessage = query; 
      } 
      else 
      { 
       base.ErrorMessage = "UndefinedName"; 
      } 
     }    

    } 
} 

aussi et vous hériter de DisplayNameAttribute et passer outre DisplayName propriété:

public class LocalizedDisplayNameAttribute : DisplayNameAttribute 
{ 
    public LocalizedDisplayNameAttribute(string displayNameKey) 
     : base(displayNameKey) 
    { 
    } 

    public override string DisplayName 
    { 
     get 
     { 
      if (!string.IsNullOrEmpty(base.DisplayName)) 
      { 
       // prefix for the selection of localized messages from datebase 
       // e.x. if DisplayName is "Country", localized messages will be: "RuCountry", "EnCountry" 
       var currentCulture = CultureInfo.CurrentCulture.TwoLetterISOLanguageName; 

       // logic to get value from datebase 
       // e.x. using Linq2Sql 
       using (var context = new dateBaseContext()) 
       { 
        var query = (from x in context.DisplayNames 
           where x.DisplayNameKey == currentCulture + base.DisplayName 
           select x.DisplayNameValue).SingleOrDefault(); 

        if (query != null) 
        { 
         return query; 
        } 

        return base.DisplayName; 
       } 
      } 

      return "UndefinedName"; 
     } 
    } 
} 

vous pouvez également créer vos attributs de validation personnalisés héritant de ValidationAttribute classe.

+0

En ce moment, il semble que ce soit encore la seule méthode qui permet l'utilisation de chaînes multilangues à partir d'une base de données. En outre, on peut également utiliser un mécanisme de mise en cache pour éviter d'interroger la base de données pour chaque validation. (Je voulais ajouter ce commentaire au cas où quelqu'un se plaint de la performance.) – beawolf