2011-11-30 22 views
6

समस्या:ASP.NET MVC4 विनीत सत्यापन स्थानीयकरण

मैं डिफ़ॉल्ट संदेश मिल मुद्दों के लिए स्थानीय होने की जरूरत निहित [आवश्यक] विनीत jQuery सत्यापन का उपयोग करते हुए जिम्मेदार बताते हैं। मैं अपने मॉडल और संबंधित संसाधन फ़ाइल में प्रत्येक int (और अन्य गैर-शून्य प्रकार) पर [आवश्यक] रखना नहीं चाहता हूं। मैं सोच रहा हूं कि किसी ने एएसपी.नेट एमवीसी 4 देव पूर्वावलोकन का परीक्षण किया है और एक ही मुद्दा देखा है? जब मैं एमवीसी कोड को देखता हूं तो यह स्पष्ट रूप से लगता है कि इसे काम करना चाहिए।

का प्रयास किया गया समाधान:

Global.asax में जोड़ा गया:

DefaultModelBinder.ResourceClassKey = "ErrorMessages"; 

एक संसाधन के साथ वैश्विक संसाधनों में "ErrorMessages.resx" और "ErrorMessages.fr.resx" कहा जाता है फ़ाइल है PropertyValueInvalid और PropertyValueRequired।

दिलचस्प जानकारी:

एक अच्छी बात मैंने देखा है कि वे तय "फील्ड एक संख्या होनी चाहिए" या से कठिन एक आंतरिक सील कक्षा में कोडित किया जा रहा "फील्ड कोई तिथि होनी चाहिए" है।

ClientDataTypeModelValidatorProvider.ResourceClassKey = "ErrorMessages"; 

यदि आप एक संसाधन वैश्विक ressources में "ErrorMessages.resx" और "ErrorMessages.fr.resx" कहा जाता है फ़ाइल है फ़ोल्डर और काम करता है FieldMustBeNumeric/FieldMustBeDate

+2

क्या आप यह कह रहे हैं कि यह एमवीसी 2/3 में काम करता है और v4 पूर्वावलोकन में टूटा हुआ है? – RickAndMSFT

उत्तर

2

मैं जानता हूँ कि यह पुराना है, लेकिन करने के लिए मेटाडेटा में स्थानीयकृत संदेश प्राप्त करें डेटा एन्नोटेशन मॉडेल वैलिडेटर को उप-वर्गीकृत करना और GetClientValidationRules को ओवरराइड करना और अपने संदेशों को आपूर्ति करने के लिए मान्य करना है।

आप DataAnnotationsModelValidatorProvider.RegisterAdapterFactory का उपयोग करके एडाप्टर पंजीकृत करते हैं।

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

public static class ModelValidationFactory 
{ 
    /// <summary> 
    /// Builds a Lamda expression with the Func&lt;ModelMetadata, ControllerContext, ValidationAttribute, ModelValidator&gt; signature 
    /// to instantiate a strongly typed constructor. This used by the <see cref="DataAnnotationsModelValidatorProvider.RegisterAdapterFactory"/> 
    /// and used (ultimately) by <see cref="ModelValidatorProviderCollection.GetValidators"/> 
    /// </summary> 
    /// <param name="adapterType">Adapter type, expecting subclass of <see cref="ValidatorResourceAdapterBase{TAttribute}"/> where T is one of the <see cref="ValidationAttribute"/> attributes</param> 
    /// <param name="attrType">The <see cref="ValidationAttribute"/> generic argument for the adapter</param> 
    /// <returns>The constructor invoker for the adapter. <see cref="DataAnnotationsModelValidationFactory"/></returns> 
    public static DataAnnotationsModelValidationFactory BuildFactory(Type adapterType, out Type attrType) 
    { 
     attrType = adapterType.BaseType.GetGenericArguments()[0]; 

     ConstructorInfo ctor = adapterType.GetConstructor(new[] { typeof(ModelMetadata), typeof(ControllerContext), attrType }); 

     ParameterInfo[] paramsInfo = ctor.GetParameters(); 

     ParameterExpression modelMetadataParam = Expression.Parameter(typeof(ModelMetadata), "metadata"); 
     ParameterExpression contextParam = Expression.Parameter(typeof(ControllerContext), "context"); 
     ParameterExpression attributeParam = Expression.Parameter(typeof(ValidationAttribute), "attribute"); 

     Expression[] ctorCallArgs = new Expression[] 
     { 
      modelMetadataParam, 
      contextParam, 
      Expression.TypeAs(attributeParam, attrType) 
     }; 

     NewExpression ctorInvoker = Expression.New(ctor, ctorCallArgs); 

     // (ModelMetadata metadata, ControllerContext context, ValidationAttribute attribute) => new {AdapterType}(metadata, context, ({AttrType})attribute) 
     return Expression 
      .Lambda(typeof(DataAnnotationsModelValidationFactory), ctorInvoker, modelMetadataParam, contextParam, attributeParam) 
      .Compile() 
      as DataAnnotationsModelValidationFactory; 
    } 
} 

यह भी MVC3 में काम करता है, और मुझे लगता है कि MVC2 रूप में अच्छी तरह।

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