2012-05-22 11 views
10

मेरे पास पूरी तरह से स्थानीयकृत वेबसाइट है, जो ज्यादातर फ्रेंच/अंग्रेजी/जर्मन में है।Asp.Net एमवीसी: कुछ गैर-स्थानीयकृत डिफ़ॉल्ट त्रुटि संदेश?

अभी के लिए, सभी ठीक चल रहे थे, लेकिन मुझे एएसपीनेट एमवीसी के कुछ त्रुटि संदेश के साथ कोई समस्या दिखाई गई।

मैं अपने मॉडल में एक प्रॉपर्टी है:

[Required] 
[LocalizedDisplayName("PublicationDate", NameResourceType = typeof(LocalizationResources.Views.Composer.BaseInfoForm))] 
public DateTime PublicationDate { get; set; } 

LocalizedDisplayname DisplayNameAttribute का ही विस्तार है, जो resx फ़ाइल में चला जाता है सही अनुवाद

धागा CurrentCulture प्राप्त करने के लिए है और CurrentCultureUI हैं एफआर-एफआर में, इसलिए संदेश फ्रेंच में प्रदर्शित किया जाना चाहिए (जैसे यह मेरे [Required] विशेषता के साथ करता है, स्वचालित रूप से "ले चैंप प्रकाशन की आवश्यकता है" प्रदर्शित करता है।

लेकिन डेटटाइम के मामले में, यदि मैं कुछ है जो एक तारीख नहीं है दर्ज करें, सत्यापनकर्ता सिर्फ मुझे देता है एक "The value 'asdfasdf' is not valid for Publication." तो:

  • क्यों MVC मुझे रिटर्न में फ्रेंच कभी कभी त्रुटि संदेश, और कभी कभी अंग्रेजी, उसी रूप में (और मैं सटीक, यह डिफ़ॉल्ट त्रुटि संदेश नहीं है)
  • कैसे "डालना le विजेता {1} ला valeur {0} n'est pas une तारीख valide"

धन्यवाद की तरह एक पाठ को दर्शाते हुए, इस संदेश को genericly को बदलने के लिए आप बहुत

उत्तर

6

मुझे लगता है कि ये आपके दो सवालों का जवाब:

  • क्यों MVC मुझ में फ्रेंच रिटर्न कभी कभी त्रुटि संदेश, और अंग्रेजी में कभी कभी, उसी रूप में (और मैं सटीक, यह डिफ़ॉल्ट त्रुटि संदेश)

एक उल्लेखनीय अंतर यह है कि 012 हैविशेषता स्पष्ट क्लाइंट-साइड सत्यापन करता है, जबकि जब आपके फ़ील्ड में वैध दिनांक समय नहीं होता है, तो आपको पोस्ट फॉर्म डेटा से डेटटाइम ऑब्जेक्ट बनाने के लिए डिफ़ॉल्ट मॉडल बाइंडर द्वारा विफलता के माध्यम से सर्वर-साइड सत्यापन प्राप्त होता है। यह काफी अलग तंत्र है, जो मुझे लगता है कि अलग-अलग परिणाम बताते हैं। अगर परिणाम निश्चित रूप से सुसंगत रहे तो यह अच्छा होता।

  • कैसे "डालना le विजेता {1} ला valeur {0} n'est pas une तारीख valide"

रहे हैं की तरह एक पाठ को दर्शाते हुए, इस संदेश को genericly को बदलने के लिए दो तरीके:

  1. DefaultModelBinder.ResourceClassKey संपत्ति का उपयोग कर त्रुटि संदेश के लिए संसाधन स्ट्रिंग का उपयोग करने के लिए डिफ़ॉल्ट मॉडल बाइंडर बताएं। इसे प्राप्त करने के तरीके के लिए this related question का उत्तर देखें (एमवीसी 2 के लिए लेकिन यह एमवीसी 3 में नहीं बदला गया है)
  2. एक अच्छी विधि (मुझे लगता है) क्लाइंट-साइड सत्यापन करना है। यह आपको आपके स्थानीय संसाधनों से इच्छित त्रुटि संदेश स्ट्रिंग प्रदान करने की अनुमति देता है। नीचे दिए गए अनुसार DataType विशेषता जोड़कर ऐसा करें, मान लें कि आपने MyLocalizedResources नामक एक संसाधन वर्ग बनाया है जिसमें एक स्ट्रिंग वाला कुंजी DateTimeFormatValidationMessage फ़्रांसीसी में अनुवाद किया गया है "ला वेलेर {0} n'est pas une date valide pour le champ {1}":

    [Required] 
    [DataType(DataType.Date, ErrorMessageResourceType = typeof(MyLocalizedResources), ErrorMessageResourceName = "DateTimeFormatValidationMessage")] 
    [LocalizedDisplayName("PublicationDate", NameResourceType = typeof(LocalizationResources.Views.Composer.BaseInfoForm))] 
    public DateTime PublicationDate { get; set; } 
    
+0

धन्यवाद। चूंकि मेरी सभी स्थानीयकरण योग्य स्ट्रिंग एक अलग डीएलएल में हैं, इसलिए मैं '1.' का उपयोग नहीं कर सकता। तो मैं दूसरे का उपयोग करूंगा। उत्तर के लिए बहुत बहुत धन्यवाद! – J4N

+0

मैंने शायद उत्तर जल्द ही स्वीकार कर लिया है, मैंने डेटाटाइप विशेषता को ठीक किया है, ठीक उसी तरह आपने कहा है, लेकिन मेरे पास अभी भी पुराना संदेश है जब मेरा प्रकार दिनांक नहीं है – J4N

+1

अन्य डेटाटाइप के लिए अन्य विशेषताएं भी हैं। उदाहरण के लिए मेरे पास एक आवश्यक ईमेल टेक्स्ट फ़ील्ड के लिए स्थानीय त्रुटि संदेशों को दिखाने के लिए है: [आवश्यक (ErrorMessageResourceType = typeof (साझा), ErrorMessageResourceName = "RequiredFieldValidationMessage", ErrorMessage = null)] [EmailAddress (ErrorMessageResourceType = typeof (Shared), ErrorMessageResourceName = "EmailFormatValidationMessage", ErrorMessage = null)] सार्वजनिक स्ट्रिंग ईमेल {प्राप्त करें; सेट; } – Clafou

1

एएसपीएन ईटी एमवीसी फ्रेमवर्क कुछ अंतर्निहित मान्यताओं को करता है: किसी को सत्यापन की आवश्यकता होती है और दूसरा यह है कि मूल्य संपत्ति के लिए मान्य है या नहीं, और यह दोनों घटना होती है, हालांकि हम डेटा-एनोटेशन के साथ गुणों को सजाने नहीं देते हैं।

आपको अपने वैश्विक संसाधन वर्ग में PropertyValueInvalid और PropertyValueRequired के लिए कुंजी बनाना है।

यह धागा तुम्हारी मदद करेगा Globally localize validation

0

आप अपने कस्टम सत्यापन विशेषताओं का स्थानीयकरण कर सकते हैं। इसके अलावा आप एएसपी.नेट एमवीसी अंतर्निहित विशेषताओं को स्थानीयकृत करते हैं।

पसंद [आवश्यक] विशेषता।

एक उदाहरण:

[LocalizedRequired(ErrorMessage = "You must specify an email address")] 
string SomeProperty { get; set; } 

और तुम सिर्फ आवश्यक संपत्ति ओवरराइड कर सकते हैं:

public class LocalizedRequiredAttribute: RequiredAttribute 
{ 
    public override string FormatErrorMessage(string name) 
    { 
     return LocalizedString(ErrorMessage, name); 
    } 
} 

reasone एडवेंचर्स भाषाओं में दर्शायी गई है: मुझे लगता है क्लाइंट में वर्तमान उपयोगकर्ता के MVC प्राप्त संस्कृति कोड पक्ष।

+0

बिलकुल नहीं .. जैसा कि मैंने कहा था, थ्रेड लोकेल fr-FR है। और दूसरा संदेश सही भाषा में था। यहां तक ​​कि क्लाइंट साइड ग्रंथ सर्वर सर्वर के साथ सर्वर पक्ष उत्पन्न होते हैं। (और डिफ़ॉल्ट रूप से मैंने थ्रेड संस्कृति को ब्राउज़र संस्कृति में सेट किया है) – J4N

0

मुझे एक ही समस्या, एक ही परियोजना संरचना थी। मैंने अंत में एमवीसी के सम्मेलनों का उपयोग किया, इस तरह से प्रयास करें।

मैं

के साथ सभी [आवश्यक] डेटा एनोटेशन प्रतिस्थापित

[आवश्यक (ErrorMessageResourceName = "Common_Mandatory_Field", ErrorMessageResourceType = typeof (MyExternalDllResources.Language))]

संसाधन स्ट्रिंग "Common_Mandatory_Field" में इस में परिभाषित किया गया है रास्ता, उदाहरण: इतालवी संसाधन फ़ाइल :: Il campo {0} è obbligatorio।

अंग्रेज़ी संसाधन फ़ाइल :: {0} फ़ील्ड आवश्यक है।

जापान संसाधन फ़ाइल :: {0} フ ィ ー ル ド が 必要 で す।

MVC का स्थान ले लेगा {0} [प्रदर्शन] जुड़े नियंत्रण से डेटा एनोटेशन मूल्य, अनुवाद मामले में अगर के नाम के साथ। यदि आप [प्रदर्शन] डेटा एनोटेशन प्रदान नहीं करते हैं तो संपत्ति परिभाषा का उपयोग किया जाएगा।

संबंधित मुद्दे