2012-06-30 16 views
54

में डेटाटाइम प्रारूप प्रारूप मैं एएसपीनेट एमवीसी 4 में डेटाटाइम के प्रारूप को कैसे मजबूर कर सकता हूं? डिस्प्ले मोड में यह दिखाता है कि मैं चाहता हूं लेकिन संपादन मॉडल में यह नहीं है। मैं displayfor और editorfor और applyformatineditmode उपयोग कर रहा हूँ dataformatstring साथ = true = "{0: DD/MM/वर्ष}" मैं क्या कोशिश की है:एएसपीनेट एमवीसी 4

  • मेरी संस्कृति के साथ web.config (उन दोनों) में भूमंडलीकरण और उदारता।
  • datetime

के लिए संस्कृति और Application_Start में uiculture()

  • कस्टम modelbinder संशोधित मैं पता नहीं कैसे यह मजबूर करने के लिए है और मैं इनपुट करने के लिए dd/एम एम/yyyy नहीं डिफ़ॉल्ट के रूप में की तारीख की जरूरत है।

    अधिक जानकारी: मेरी viewmodel इस

    [DisplayName("date of birth")] 
        [DataType(DataType.Date)] 
        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
        public DateTime? Birth { get; set; } 
    

    दृश्य मैं @Html.DisplayFor(m=>m.Birth) प्रयोग की तरह है, लेकिन यह अपेक्षा के अनुरूप (मैं स्वरूपण देखें) और इनपुट तारीख को मैं @Html.EditorFor(m=>m.Birth) का उपयोग लेकिन अगर मैं कोशिश करते हैं और काम करता है 13/12/2000 की तरह कुछ इनपुट त्रुटि के साथ विफल रहता है कि यह मान्य दिनांक नहीं है (12/13/2000 और 2000/12/13 अपेक्षित काम कर रहे हैं लेकिन मुझे डीडी/एमएम/वाईई की आवश्यकता है)।

    कस्टम मॉडलबिंडर application_start() b/c में कहा जाता है मुझे और नहीं पता है।

    <globalization/> का उपयोग करके मैंने culture="ro-RO", uiCulture="ro" और अन्य संस्कृतियों के साथ प्रयास किया है जो मुझे डीडी/एमएम/yyyy दे देंगे। ऐसा लगता है: मैं भी) Application_Start (में एक प्रति धागा आधार पर यह स्थापित करने के लिए (वहाँ ऐसा करने के तरीके पर, यहाँ उदाहरण के एक बहुत हैं)


    सभी के लिए है कि इस सवाल का पढ़ा जाएगा की कोशिश की है कि डारिन डिमिट्रोव का जवाब तब तक काम करेगा जब तक मेरे पास क्लाइंट सत्यापन नहीं है। क्लाइंट साइड सत्यापन सहित कस्टम सत्यापन का उपयोग करना एक और तरीका है। मुझे खुशी है कि मैंने पूरे एप्लिकेशन को पुनर्निर्माण से पहले यह पाया।

  • +0

    आप एक प्रदान करते हैं कृपया सकते हैं:

    @Scripts.Render("~/Scripts/jquery-3.1.1.js") @Scripts.Render("~/Scripts/jquery.validate.min.js") @Scripts.Render("~/Scripts/jquery.validate.unobtrusive.min.js") @Scripts.Render("~/Scripts/moment.js") 

    आप का उपयोग moment.js स्थापित कर सकते हैं थोड़ा और जानकारी? आपका मॉडल, नियंत्रक और देखें? डिस्प्ले और एडिटर टेम्पलेट के बीच मिलने वाले विभिन्न आउटपुट का एक उदाहरण भी प्रदान करें। यह भी ध्यान दें कि संस्कृति प्रति थ्रेड सेट है। आपने 'Application_Start' के बारे में कुछ बताया है, लेकिन यह आपका आवेदन शुरू होने पर केवल एक बार निष्पादित किया जाता है। बाद के अनुरोधों के बारे में क्या? आप उनके लिए संस्कृति कैसे स्थापित कर रहे हैं? –

    +0

    एप्लिकेशन_स्टार्ट केवल एक बार निष्पादित में! इसके बजाए application_beginRequest का प्रयोग करें! – Nas

    +0

    नास, application_beginRequest कहां होगा? मैं केवल ग्लोबल में application_start देखता हूं। एमवीसी में 4 चीजें थोड़ी अलग होने लगती हैं तो एमवीसी 3 – amb

    उत्तर

    96

    अहह, अब यह स्पष्ट है। आपको मूल्य वापस बाध्य करने में समस्याएं प्रतीत होती हैं। इसे देखने पर प्रदर्शित नहीं है। वास्तव में, यह डिफ़ॉल्ट मॉडल बांधने की मशीन की गलती है। आप एक कस्टम व्यक्ति को लिख और उपयोग कर सकते हैं जो आपके मॉडल पर [DisplayFormat] विशेषता को ध्यान में रखेगा। मैं इस तरह के एक कस्टम मॉडल बांधने की मशीन यहाँ सचित्र है: https://stackoverflow.com/a/7836093/29407


    जाहिर है कुछ समस्याएं अभी भी लागू हैं। यहां मेरा पूरा सेटअप एएसपी.नेट एमवीसी 3 & 4 आरसी दोनों पर पूरी तरह से ठीक काम कर रहा है।

    मॉडल:

    public class MyViewModel 
    { 
        [DisplayName("date of birth")] 
        [DataType(DataType.Date)] 
        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
        public DateTime? Birth { get; set; } 
    } 
    

    नियंत्रक:

    public class HomeController : Controller 
    { 
        public ActionResult Index() 
        { 
         return View(new MyViewModel 
         { 
          Birth = DateTime.Now 
         }); 
        } 
    
        [HttpPost] 
        public ActionResult Index(MyViewModel model) 
        { 
         return View(model); 
        } 
    } 
    

    दृश्य:

    @model MyViewModel 
    
    @using (Html.BeginForm()) 
    { 
        @Html.LabelFor(x => x.Birth) 
        @Html.EditorFor(x => x.Birth) 
        @Html.ValidationMessageFor(x => x.Birth) 
        <button type="submit">OK</button> 
    } 
    

    कस्टम मॉडल बांधने की मशीन का पंजीकरण Application_Start में:

    ModelBinders.Binders.Add(typeof(DateTime?), new MyDateTimeModelBinder()); 
    

    और कस्टम मॉडल बांधने की मशीन में ही:

    public class MyDateTimeModelBinder : DefaultModelBinder 
    { 
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
        { 
         var displayFormat = bindingContext.ModelMetadata.DisplayFormatString; 
         var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
    
         if (!string.IsNullOrEmpty(displayFormat) && value != null) 
         { 
          DateTime date; 
          displayFormat = displayFormat.Replace("{0:", string.Empty).Replace("}", string.Empty); 
          // use the format specified in the DisplayFormat attribute to parse the date 
          if (DateTime.TryParseExact(value.AttemptedValue, displayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) 
          { 
           return date; 
          } 
          else 
          { 
           bindingContext.ModelState.AddModelError(
            bindingContext.ModelName, 
            string.Format("{0} is an invalid date format", value.AttemptedValue) 
           ); 
          } 
         } 
    
         return base.BindModel(controllerContext, bindingContext); 
        } 
    } 
    

    अब, कोई बात नहीं क्या आप अपने संस्कृति web.config (<globalization> तत्व) या वर्तमान धागा संस्कृति में सेटअप, कस्टम मॉडल बांधने की मशीन DisplayFormat विशेषता के उपयोग करेगा शून्य प्रारूपों को पार्स करते समय दिनांक प्रारूप।

    +1

    यह वह है जिसे मैंने उपयोग किया है लेकिन बिना किसी किस्मत के। मैंने इसे डेटाटाइम और डेटाटाइम दोनों के साथ पंजीकृत किया है? यह मेरा त्रुटि संदेश भी नहीं दिखाता है, इसलिए मुझे नहीं लगता कि यह उपयोग हो रहा है। – amb

    +1

    तो मुझे लगता है कि आपको अपना पूरा कोड दिखाना होगा जिससे हम समस्या को पुन: उत्पन्न कर सकें, क्योंकि मैं बिना किसी समस्या के इस मॉडल बाइंडर का उपयोग कर रहा हूं। –

    +0

    जिज्ञासा से, यह किस तरह का एमवीसी प्रोजेक्ट है (4 या 3)? – amb

    0

    धन्यवाद डैरिन, मेरे लिए, बनाने के विधि करने के लिए पोस्ट करने के लिए सक्षम होने के लिए, यह केवल बाद मैं करने के लिए BindModel कोड को संशोधित किया काम:

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
        var displayFormat = bindingContext.ModelMetadata.DisplayFormatString; 
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
    
        if (!string.IsNullOrEmpty(displayFormat) && value != null) 
        { 
         DateTime date; 
         displayFormat = displayFormat.Replace("{0:", string.Empty).Replace("}", string.Empty); 
         // use the format specified in the DisplayFormat attribute to parse the date 
         if (DateTime.TryParse(value.AttemptedValue, CultureInfo.GetCultureInfo("en-GB"), DateTimeStyles.None, out date)) 
         { 
          return date; 
         } 
         else 
         { 
          bindingContext.ModelState.AddModelError(
           bindingContext.ModelName, 
           string.Format("{0} is an invalid date format", value.AttemptedValue) 
          ); 
         } 
        } 
    
        return base.BindModel(controllerContext, bindingContext); 
    } 
    

    आशा इस किसी और मदद कर सकता है ...

    0

    ग्राहक सत्यापन संबंधी समस्याएं jquery.validate.unobtrusive.min.js जो किसी भी तरह से में दिनांक/दिनांक प्रारूप को स्वीकार नहीं करता में MVC बग (MVC 5 में भी) की वजह से हो सकता है। दुर्भाग्य से आपको इसे मैन्युअल रूप से हल करना होगा।

    मेरे अंत में काम कर समाधान:

    $(function() { 
        $.validator.methods.date = function (value, element) { 
         return this.optional(element) || moment(value, "DD.MM.YYYY", true).isValid(); 
        } 
    }); 
    

    आप से पहले शामिल करने के लिए है:

    Install-Package Moment.js