2010-10-19 15 views
7

मैं asp.net MVC के लिए काफी नया हूँ, और सही जानता हूँ कि मैं इनपुट सत्यापन करने के लिए एक अच्छा अभ्यास पता लगाने के लिए कोशिश कर रहा हूँ। (asp.net MVC के इनपुट/मॉडल सत्यापन बहु भाषा

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

यह है काफी अच्छा, पर हमें कोई बहु भाषा वेबसाइट है:

परियोजना में हम इकाई ढांचे का उपयोग करने के लिए आप निम्नलिखित तरीके से गुणों के डेटा एनोटेशन जोड़ सकते हैं जहां जा रहे हैं सबसे वेबसाइटों की तरह), इसलिए हम केवल अंग्रेजी में त्रुटि संदेश नहीं दिखा सकते। इसे हल करने का कोई तरीका क्या हो सकता है? क्या मैं उपयोगकर्ता की भाषा के आधार पर इस त्रुटि को @runtime बदल सकता हूं? क्या मुझे Jquery क्लाइंट साइड सत्यापन का उपयोग करना चाहिए?

इनपुट के लिए धन्यवाद।

अद्यतन मैंने फिल हैक की वेबसाइट पर कोड का प्रयास किया है, यह स्थिर संसाधनों के साथ चाल करेगा हालांकि, हम उन संसाधनों का उपयोग करते हैं जो डेटाबेस से स्थिर संसाधन नहीं हैं।

अगर मैं dataannotations के लिए निम्नलिखित में भरने: एक सुलभ स्थिर संपत्ति नाम '1277' संसाधन प्रकार 'CustomResourceProviders.DBResourceProviderFactory' नहीं है:

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

तो मैं निम्नलिखित त्रुटि मिलती है।

बेशक ऐसी कोई संपत्ति है, यह एक समारोह द्वारा पहुँचा जा चाहिए। कोई विचार है कि मैं इसके बारे में क्या कर सकता हूं? टीएनएक्स

उत्तर

2

फिल हैक ने good blog post लिखा है जिसमें यह कैसे किया जाता है। अनिवार्य रूप से यह संदेश प्रदान करने के लिए संसाधन फ़ाइलों का उपयोग करने के अलावा यह वही है।

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

जवाब के लिए धन्यवाद इस पोस्ट पर एक नजर डालें। – denappel

+0

मैं प्रश्न संपादित किया है, क्योंकि यद्यपि जवाब उपयोगी है, यह मेरी समस्या पूरी तरह से – denappel

+0

का समाधान नहीं करता आप समाधान खोजने करो, मैं एक ही समस्या में पड़ गए के रूप में आप इस समय के रूप में –

8

आप RequiredAttribute से कस्टम विशेषता के वारिस और संपत्ति ErrorMessage के लिए अपने स्वयं के स्थानीय संदेश सेट कर सकते हैं। भी

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"; 
      } 
     }    

    } 
} 

और आप DisplayNameAttribute से विरासत और DisplayName संपत्ति को ओवरराइड:: यह इस तरह दिखता है सकते हैं

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"; 
     } 
    } 
} 

भी आप अपने कस्टम सत्यापन विशेषताओं ValidationAttribute वर्ग से विरासत बना सकते हैं।

+0

, ऐसा लगता है कि यह अभी भी है एकमात्र तरीका जो डेटाबेस से बहुभाषी तारों के उपयोग को सक्षम बनाता है। इसके अलावा, प्रत्येक सत्यापन के लिए डेटाबेस से पूछताछ रोकने के लिए कोई भी कैशिंग तंत्र का उपयोग कर सकता है। (मैं इस टिप्पणी के मामले में किसी को भी प्रदर्शन के बारे में शिकायत जोड़ना चाहते थे।) – beawolf