2012-11-29 17 views
11

में प्रमाणीकरण मैंने एमवीसी 3 समाधान को एमवीसी 4 में अपग्रेड किया। प्रवासन के बाद, वैधकर्ता टूट गया है।अविभाज्य दिनांक समय? एमवीसी 4

मेरी इनपुट तिथि, यदि मैं जर्मन भाषा के रूप में चुनता हूं, तो "20.03.2013" है। मुझे एमवीसी 4 में एक सत्यापन त्रुटि मिलती है, लेकिन एमवीसी 3 में नहीं। यदि मैं प्रारूप को "20.03.2013" से "20/03/2013" में बदलता हूं तो यह एमवीसी 4 में काम करता है, लेकिन एमवीसी 3 में नहीं ;-)

मैंने वर्तमान धागे की यूआई संस्कृति को जर्मन में सेट किया है। ResX मानों का आउटपुट सही भाषा में है, इसलिए मुझे पता है कि संस्कृति के साथ कोई त्रुटि नहीं होनी चाहिए।, केवल साइट के लिए ही। त्रुटि संदेश अंग्रेजी में हैं, लेकिन साइट जर्मन में है।

मुझे लगता है कि इसका मतलब है कि वैधकर्ता गलत यूआई संस्कृति का उपयोग करता है।

यहां कोड का उपयोग किया गया है।

 
[Required(ErrorMessageResourceName = "Error_DepartureDate", ErrorMessageResourceType = typeof(Resx.Query))] 
public DateTime? DepartureDate { get; set; } 

मुझे लगता है कि वहाँ कुछ डिफ़ॉल्ट मॉडल बांधने की मशीन के साथ गलत है, गाया एचटीएमएल के रूप में अच्छा लग रहा है:

 
data-lang="de" data-mindate="3" data-val="true" data-val-required="Bitte geben Sie das gewünschte Reisedatum des Hinflugs ein." id="DepartureDate" name="DepartureDate" tabindex="3" type="text" value="" 

मुझे लगता है कि जहाज के सूत्रों के Jscript उन्नत बनाया है जब आप का उपयोग कर एक नया MVC अनुप्रयोग बनाने विजुअल स्टूडियो 2012 (एसपी 1 स्थापित है) टेम्पलेट्स। इसका कोई प्रभाव नहीं पड़ा।

मेरे पास एक संस्कृतिमोडेल बाइंडर है जो वर्तमान संस्कृति को सत्र से बाहर पढ़ता है और एक छोटे से सहायक समारोह का उपयोग करके संस्कृति को सेट करता है।

 
public static void UpdateThreadCulture(CultureInfo culture) 
{ 
    Thread.CurrentThread.CurrentUICulture = culture;    
}   

संस्कृति मॉडल बांधने वाला डिफॉल्ट बाइंडर है।

 
ModelBinders.Binders.DefaultBinder = new CultureModelBinder(); 
ModelBinders.Binders.Add(typeof(DateTime?), new DateTimeModelBinder()); 
// and many, many more 

शायद एमवीसी 4 के साथ निष्पादन आदेश में कुछ बदल गया है जिसके परिणामस्वरूप समस्या है?

अद्यतन: प्रोजेक्ट .NET Framework 4.5 को लक्ष्य के रूप में उपयोग करता है।

अद्यतन 2:

मैं एक कॉम्बो बॉक्स जहां उपयोगकर्ता 16 अलग-अलग भाषाओं का चयन कर सकते हैं, तो प्रत्येक का अपना विशिष्ट स्वरूपण है हो सकता है।

उदा। डीई-डी -> डीडी.एमएम.YYYY; एन-एन -> डीडी/एमएम/वाई वाई वाई; en-us -> एमएम/डीडी/वाईवायवाई

मुझे वर्तमान संस्कृति को स्थापित करने के बारे में एक संकेत मिला है, यहां यह सबूत है कि यह सही होना चाहिए। वैध कोड विफल होने पर यह कोड हिट नहीं होता है, ऐसा लगता है कि यह क्लाइंट पक्ष पर होता है।

 
    public class DateTimeModelBinder : IModelBinder 
    { 
     private LogService _log = new LogService(); 

     public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     {    
      object result = null; 
      ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
      if (valueResult != null) 
      { 
       try 
       { 
        var stateHandler = new StateHandler(controllerContext.HttpContext.Session);      
        result = valueResult.ConvertTo(typeof(DateTime?), stateHandler.Culture);          
       } 
       catch 
       { 
        try 
        { 
         result = valueResult.ConvertTo(typeof(DateTime?), CultureInfo.InvariantCulture); 
        } 
        catch (Exception ex) 
        { 
         _log.Error("DateTimeModelBinder parse exception", ex); 
         _log.KeyValue("AttemptedValue", valueResult.AttemptedValue);           
        }      
       } 
      } 
      return result; 
     } 
    } 

और संपूर्णता मेरी संस्कृति मॉडल बांधने की मशीन के लिए:

 
    public class CultureModelBinder : DefaultModelBinder 
    {  
     public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      StateHandler stateHandler = new StateHandler(controllerContext.HttpContext.Session); 
      Helper.UpdateThreadCulture(stateHandler.Culture); 

      return base.BindModel(controllerContext, bindingContext); 
     }   
    } 

अद्यतन: http://connect.microsoft.com/VisualStudio/feedback/details/705643/a-data-val-date-attribute-is-generated-for-time-fields-in-asp-net-mvc-4

अपडेट:: पढ़ें निम्न आलेख: http://weblogs.asp.net/scottgu/archive/2010/06/10/jquery-globalization-plugin-from-microsoft.aspx

हो सकता है कि इस समस्या का एक संबंध है

ने निम्न प्रयास किया:

निम्न क्रम में स्क्रिप्ट लोड किया गया:

 
/Scripts/jquery-1.8.3.min.js 
/Scripts/globalize.js 
/Scripts/cultures/globalize.cultures.js 
// and much more other scripts... 

कॉल गयी। आउटपुट सही ढंग से "डीई" था।

 
     var currentLanguage = $("#DepartureDate").attr("data-lang"); 
     alert(currentLanguage);  
     $.preferCulture(currentLanguage); 

नहीं प्रमाणकों के लिए प्रभावित कर ...

+0

मेरे अपने प्रश्न के संभावित डुप्लिकेट: पी http://stackoverflow.com/questions/11756226/dot-separated-clientside-date-validation-in-asp-mvc-4/11771781#11771781 –

+0

Thx, मैंने आपका प्रश्न देखा। मैं बंडल का उपयोग नहीं करता। यह एमवीसी 3 से एमवीसी 4 तक 1: 1 अपग्रेड था। मैंने टेम्पलेट से एक नई एमवीसी 4 परियोजना बनाने की भी कोशिश की और एक ही समस्या है। मैंने तब बंडल हटा दिया और इसका कोई प्रभाव नहीं पड़ा। – NickD

+0

क्या आपने प्रश्न में देखा गया डिफ़ॉल्ट jquery date validator को ओवरराइड किया है? –

उत्तर

10

बिंदु नहीं करता है कि Mvc3 क्लाइंट पक्ष यह है कि पर सभी तिथियों पर मान्य है बिंदु। आपने बस सर्वर की ओर से संस्कृति स्थापित की है .... लेकिन आपकी संस्कृति सेटिंग्स क्लाइंट साइड पर बिल्कुल दिखाई नहीं दे रही है ... कम से कम एमवीसी इंजन स्वचालित रूप से ऐसा नहीं करता है। अंग्रेजी से भिन्न संस्कृतियों के साथ ग्राहक पक्ष पर उचित तिथि और संख्या को संभालने का एकमात्र तरीका ए जावास्क्रिप्ट वैश्वीकरण लाइब्रेरी का उपयोग करना है जो सभी संस्कृतियों में उचित तिथियों को पार्स करने में सक्षम है, और सर्वर साइड संस्कृति के बराबर क्लाइंट साइड संस्कृति सेट करने के लिए है , तो आपको वैश्वीकृत कार्यों का उपयोग करने के लिए सभी सत्यापन विधियों को ठीक से परिभाषित करना होगा। कृपया मेरे ब्लॉग की इस पोस्ट कैसे ठीक क्लाइंट की तरफ वैश्वीकरण को संभालने के लिए स्पष्ट करता है कि पढ़ें: http://www.dotnet-programming.com/post/2011/12/14/Globalization-Validation-and-DateNumber-Formats-in-AspNet-MVC.aspx

इसके अलावा, न तो कृपया CurrentUICulture CurrentUICulture साथ CurrentCulture भ्रमित नहीं करता है सभी तरह से संख्या में प्रभावित करते हैं या दिनांक से नियंत्रित किया जाता है, लेकिन केवल संसाधन स्थानीय विनिर्देशों जैसे संस्कृति विनिर्देश संसाधनों वाली फाइलें।

अंत में, मॉडल बाइंडर में संस्कृति को सेट करने के लिए यह बहुत अक्षम है, क्योंकि मॉडल बाइंडर एक पुनरावर्ती कार्य है, इसलिए इसे मॉडल पुनर्निर्माण के दौरान सैकड़ों बार बुलाया जाता है, और संस्कृति सेटिंग ऑपरेशन एक साधारण परिवर्तनीय सेटिंग ऑपरेशन नहीं है लेकिन इसकी नगण्य लागत नहीं है। संस्कृति सेटिंग को संभालने के लिए एक वैश्विक नियंत्रक फ़िल्टर लिखना बेहतर होता है (मैं हमेशा इस तरह से करता हूं) इसलिए ऑपरेशन प्रति अनुरोध केवल एक बार किया जाता है

+0

धन्यवाद , कल इसे आजमाएं ;-) – NickD

+0

यह एक टन बचाया !!! धन्यवाद! – Andrei

3

डिफ़ॉल्ट दिनांक सत्यापनकर्ता अधिलेखन का प्रयास करें:

// Replace dots so jq validator can understand what's going on 
$(function() { 
    $.validator.addMethod(
    "date", 
    function (value, element) { 
     var s = value; 
     s = value.replace(/\./g, '/'); 

     // Chrome requires tolocaledatestring conversion, otherwise just use the slashed format 
     var d = new Date(); 
     return this.optional(element) || !/Invalid|NaN/.test(new Date(d.toLocaleDateString(value))) || !/Invalid|NaN/.test(new Date(s)); 
    }, 
    "" 
    ); 
}); 

$.validator.unobtrusive.parse(); 
+0

के साथ टूट गया था, धन्यवाद, वर्तमान में यह कोशिश कर रहा है। मुझे उम्मीद है कि बहुत अधिक कोड संशोधित किए बिना समाधान ढूंढने की उम्मीद है। जैसा कि कहा जाता है, यह काम करता है बिना किसी समस्या के एमवीसी 3 के साथ। – NickD

+1

मुझे पता है और मैं वास्तव में जानना चाहता हूं कि वास्तव में समस्या क्या है, इस क्लाइंटसाइड डेटपिकर सत्यापन/स्वरूपण ने मुझे इतना सिरदर्द बनाया है कि यह अविश्वसनीय है। यह चीज़ वास्तव में आवश्यक नहीं होनी चाहिए। –

+0

मैं इस समाधान पर विचार कर सकता हूं एक कस्टम मॉडल बाइंडर के साथ संयोजन में। मैं सभी संस्कृतियों के लिए अंसी डेट प्रारूप की तारीख को प्रारूपित कर सकता हूं और डेटाटाइम अधिभार का उपयोग कर सकता हूं जहां मैं वर्ष, महीने और दिन अलग-अलग पास कर सकता हूं। लेकिन चलो प्रतीक्षा करें और देखें कि बेहतर समाधान हैं: डी – NickD

0

माइक्रोसॉफ्ट पुराने jquery के साथ mvc4 से नए jquery.validate.js को प्रतिस्थापित करने का सुझाव देता है। MVC3 प्रोजेक्ट टेम्पलेट से .validate.js। यह काम करता है, लेकिन मजाकिया बात यह है कि बग एमवीसी 4 में नहीं है, यह एमवीसी 3 में था।

हम फ्रांसेस्को द्वारा वर्णित तरीके का उपयोग करते हैं, स्वीकृत उत्तर देखें।

0

यदि यह केवल क्रोम में होता है तो यह तारीखों के सत्यापन में एक संस्कृति बग वाले jquery संस्करण के कारण होता है।

+0

नहीं, यह सभी ब्राउज़रों में है। यह अब सही काम करता है। – NickD

2

आईएलएसपी के साथ कोड के माध्यम से देखकर यह नया पेश किया गया क्लाइंटडेटा टाइपइपोडेलिडाइटर प्रदाता है जो डाटा-वैल-डेट विशेषता जोड़ रहा है।

यदि आप एमवीसी 3 शैली की कार्यक्षमता पर वापस जाना चाहते हैं तो बस उस प्रदाता को मॉडल सत्यापन प्रदाताओं की सूची से हटाकर चाल चलती है।

यह समस्या का समाधान नहीं करता है लेकिन कोड की कुछ पंक्तियों में jquery सत्यापन की वैश्वीकरण की कमी के कारण होने वाली समस्याओं को हटा सकता है।

using System.Web.Mvc; 

... 

protected void Application_Start() 
{ 
    var providers = ModelValidatorProviders.Providers; 
    var clientDataTypeModelValidatorProvider = providers.OfType<ClientDataTypeModelValidatorProvider>().FirstOrDefault(); 
    if (clientDataTypeModelValidatorProvider != null) 
    { 
    providers.Remove(clientDataTypeModelValidatorProvider); 
    } 

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