MVC4 DataType.Date EditorFor Chrome में दिनांक मान प्रदर्शित नहीं करेगा, जो Internet Explorer में ठीक है


198

मैं अपने मॉडल पर DataType.Date विशेषता और मेरे विचार में EditorFor का उपयोग कर रहा हूं। यह Internet Explorer 8 और Internet Explorer 9 में ठीक काम कर रहा है , लेकिन Google Chrome में यह एक दिनांक पिकर दिखा रहा है और मान प्रदर्शित करने के बजाय यह केवल "महीना / दिन / वर्ष" को फीके ग्रे पाठ में प्रदर्शित करता है।

Google Chrome मान क्यों प्रदर्शित नहीं करेगा?

नमूना:

[DataType(DataType.Date)]
public Nullable<System.DateTime> EstPurchaseDate { get; set; }

राय:

<td class="fieldLabel">Est. Pur. Date</td>
<td class="field">@Html.EditorFor(m=>m.EstPurchaseDate)</td>

क्रोम

इंटरनेट एक्स्प्लोरर

जवाबों:


377

जब आप [DataType(DataType.Date)]ASP.NET MVC 4 में डिफ़ॉल्ट टेम्पलेट के साथ एक मॉडल संपत्ति को सजाते हैं type="date":

<input class="text-box single-line" 
       data-val="true" 
       data-val-date="The field EstPurchaseDate must be a date."
       id="EstPurchaseDate" 
       name="EstPurchaseDate" 
       type="date" value="9/28/2012" />

HTML5 जैसे Google Chrome का समर्थन करने वाले ब्राउज़र इस इनपुट फ़ील्ड को दिनांक पिकर के साथ प्रस्तुत करते हैं।

दिनांक को सही ढंग से प्रदर्शित करने के लिए, मान को प्रारूपित किया जाना चाहिए 2012-09-28विनिर्देशन से उद्धरण :

मूल्य: एक मान्य पूर्ण-तिथि [RFC 3339] में परिभाषित की गई, अतिरिक्त योग्यता के साथ कि वर्ष घटक 0 से अधिक संख्या का प्रतिनिधित्व करने वाले चार या अधिक अंक है।

आप DisplayFormatविशेषता का उपयोग करके इस प्रारूप को लागू कर सकते हैं :

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public Nullable<System.DateTime> EstPurchaseDate { get; set; }

44
डारिन धन्यवाद, यह एकदम सही था! आपने पिछले दो वर्षों में मेरे कई MVC सवालों के जवाब दिए हैं, आप रॉक!
बेन फिंकेल

3
महान जवाब लेकिन मुझे लगता है कि यह आपको अपील कर रहा है कि आपको इसे ठीक से काम करने के लिए नियंत्रण पाने के लिए मजबूर करना होगा!
Coops

7
चिह्नित किए गए सभी गुणों के लिए यह "विश्व स्तर पर" करने का तरीका क्या होगा, [DataType(DataType.Date)]इसलिए मुझे कुछ गायब होने के जोखिम के साथ इन सभी गुणों को अलग से चिह्नित नहीं करना होगा?
मार्जन वेनेमा

7
डारिन, यूएसए के बाहर के लोग क्या कर सकते हैं? मैं विनिर्देश मूल्य कैसे निर्धारित कर सकता हूं लेकिन कस्टम तिथि प्रारूप प्रदर्शित कर सकता हूं? यानी, ब्रिटेन?
पायोतर कुला

3
@ MarjanVenema- मैंने मैट हनीकट के फेलट्रैकर ( github.com/MattHoneycutt/Fail-Tracker ) से "एक्स्टेंसिबलमोडेलमेटाटा ड्रॉपर" का उपयोग किया है । Infrastructure संरचना के तहत ModelMetadata को देखें। मैंने उन कक्षाओं का उपयोग किया है और फिर IModelMetadataFilter का फ़िल्टर कार्यान्वयन बनाया है। जब TransformMetadata विधि को कॉल किया जाता है, तो आप मेटाडेटा के "DisplayFormatString" और "EditFormatString" गुणों को संपादित कर सकते हैं। आशा है कि यह आपको सही दिशा में ले जाता है (btw, एक बहुत बढ़िया वीडियो है जो फेल-ट्रैकर का उपयोग करता है)
SwampyFox

44

MVC5.2 में, Date.cshtml को फ़ोल्डर में जोड़ें ~ / Views / साझा / EditorTemplates:

@model DateTime?
@{
    IDictionary<string, object> htmlAttributes;
    object objAttributes;
    if (ViewData.TryGetValue("htmlAttributes", out objAttributes))
    {
        htmlAttributes = objAttributes as IDictionary<string, object> ?? HtmlHelper.AnonymousObjectToHtmlAttributes(objAttributes);
    }
    else
    {
        htmlAttributes = new RouteValueDictionary();
    }
    htmlAttributes.Add("type", "date");
    String format = (Request.UserAgent != null && Request.UserAgent.Contains("Chrome")) ? "{0:yyyy-MM-dd}" : "{0:d}";
    @Html.TextBox("", Model, format, htmlAttributes)
}

धन्यवाद! उल्लेखित क्रोम "समस्या" को ठीक करता है और निश्चित रूप से आपके पास अपनी डेटाटाइम संपत्ति पर एक और डिस्प्लेफॉर्म हो सकता है!
19x पर cmxl

हाँ महान समाधान। यह उन लोगों के लिए एक उत्कृष्ट कार्य है जो अमेरिका में नहीं हैं।
रिचर्ड मैककेना

मुझे लगता है कि यह समस्या का सबसे अच्छा समाधान है, यह सिर्फ संपादक समस्या को ठीक करता है और मौजूदा प्रदर्शन स्वरूपण को प्रभावित नहीं करता है।
dsghi

1
"DateTime.cshtml" के बजाय "Date.cshtml" का उपयोग करना जादू का जवाब था! यह MVC 4 में भी काम करता है।
एट्रॉन सेज


16

डारिन दिमित्रोव के जवाब के अतिरिक्त:

यदि आप केवल एक विशेष (मानक से भिन्न) प्रारूप का उपयोग करना चाहते हैं, तो आप MVC5 में उपयोग कर सकते हैं:

@Html.EditorFor(model => model.Property, new {htmlAttributes = new {@Value = @Model.Property.ToString("yyyy-MM-dd"), @class = "customclass" } })

जैसा @कि शुरुआत में है, कि @Value = @Model.Property...अभी भी जरूरत है @? क्या आपका मतलब सिर्फ इतना है new { Value = Model.Property...?
user3454439

11

MVC 3 में मुझे जोड़ना था:

using System.ComponentModel.DataAnnotations;

गुणों को जोड़ते समय हमारे बीच:

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]

खासकर अगर आप इन गुणों को मेरे जैसे .edmx फ़ाइल में जोड़ रहे हैं। मैंने पाया कि डिफ़ॉल्ट रूप से .edmx फ़ाइलों का उपयोग नहीं होता है इसलिए केवल प्रोपेटीज़ जोड़ना काफी नहीं होता है।


10

यदि आप [DataType(DataType.Date)]अपने मॉडल से हटाते हैं , तो क्रोम में इनपुट फ़ील्ड के रूप में प्रस्तुत किया जाता है type="datetime"और यह डेटपिकर को भी नहीं दिखाएगा।


धन्यवाद बर्नी। मैं लेने वाले के साथ इतना परेशान नहीं था जैसा कि मैं दिखा रहा था कि इनपुट बॉक्स में डेटा नहीं डाला गया था। हालांकि यह जानना अच्छा है।
बेन फिंकेल

ओपेरा हालांकि एक डेटपिकर का प्रतिपादन करता है। कुछ
पॉलीफ़िल

1
यदि यह एक तिथि माना जाता है, तो इसे एक प्रकार के इनपुट के रूप में प्रस्तुत किया जाना चाहिए datedatetimeएक कार्य के रूप में उपयोग करना अनुचित है, क्योंकि यह डेटा का प्रतिनिधित्व नहीं करता है।
क्रिस प्रैट

4

मैं अभी भी इसके साथ एक प्रारूप yyyy-MM-dd पास कर रहा था, लेकिन मैं Date.chtml को बदलकर इसके चारों ओर मिल गया:

@model DateTime?

@{
    string date = string.Empty;
    if (Model != null)
    {
        date = string.Format("{0}-{1}-{2}", Model.Value.Year, Model.Value.Month, Model.Value.Day);
    }

    @Html.TextBox(string.Empty, date, new { @class = "datefield", type = "date"  })
}

शुक्रिया अंत में यह काम किया, मैंने प्रारूप string.Format("{0}/{1}/{2}")प्राप्त करने की कोशिश की dd/mm/yyyy, और यह ठीक काम करता है, मैंने डेटाबेस पहली विधि का उपयोग किया लेकिन DisplayFormat ने आंशिक वर्ग के साथ काम नहीं किया, पता नहीं क्यों ?, वैसे भी किसी को भी इस पद्धति की कोशिश करने की आवश्यकता है , तो मैंने नहीं किया ' टी की कोशिश, लेकिन अगर किसी को भी जरूरत है, आशा है कि यह मदद करता है
shaijut

3

MVC4 के उत्तर दें DataType.Date EditorFor क्रोम में दिनांक मान प्रदर्शित नहीं करेगा, ठीक IE में

मॉडल में आपको निम्नलिखित प्रकार की घोषणा करने की आवश्यकता है:

[DataType(DataType.Date)]
public DateTime? DateXYZ { get; set; }

या

[DataType(DataType.Date)]
public Nullable<System.DateTime> DateXYZ { get; set; }

आपको निम्नलिखित विशेषता का उपयोग करने की आवश्यकता नहीं है:

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]

Date.cshtml पर इस टेम्पलेट का उपयोग करें:

@model Nullable<DateTime>
@using System.Globalization;

@{
    DateTime dt = DateTime.Now;
    if (Model != null)
    {
        dt = (System.DateTime)Model;

    }

    if (Request.Browser.Type.ToUpper().Contains("IE") || Request.Browser.Type.Contains("InternetExplorer"))
    {
        @Html.TextBox("", String.Format("{0:d}", dt.ToShortDateString()), new { @class = "datefield", type = "date" })
    }
    else
    {
        //Tested in chrome
        DateTimeFormatInfo dtfi = CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat;
        dtfi.DateSeparator = "-";
        dtfi.ShortDatePattern = @"yyyy/MM/dd"; 
        @Html.TextBox("", String.Format("{0:d}", dt.ToString("d", dtfi)), new { @class = "datefield", type = "date" })
    } 
}

मज़े करो! सादर, ब्लर्टन


यदि आप इसे इस तरह से करते हैं, तो Chrome आपको एक तारीख लेने वाला नहीं देगा। मैं आपके समाधान का उपयोग कर रहा हूं, लेकिन इसे संशोधित कर रहा हूं ताकि 1) मैं DisplayFormatविशेषता 2 का उपयोग करता हूं ) यह जांचने के लिए परीक्षण बदलें कि क्या ब्राउज़र का प्रकार क्रोम है, तो @Html.EditorFor(m=>m.EstPurchaseDate)3 करें) Else do @Html.TextBox("EstPurchaseDate", dt.ToString("MM/dd/yyyy"))Note: # 2 पर, एक बेहतर जांच होगी यदि ब्राउज़र HTML5 को समझता है, लेकिन मुझे नहीं पता कि यह कैसे करना है।
डेविड

4
सर्वर साइड कोड में ब्राउज़र का पता लगाने के लिए डाउनवोटिंग।
टेटसुजिन नो ओनी

1

यदि आपको दिनांक के प्रारूप पर नियंत्रण रखने की आवश्यकता है (दूसरे शब्दों में न केवल yyyy-mm-dd प्रारूप स्वीकार्य है), एक अन्य समाधान एक सहायक संपत्ति जोड़ सकता है जो प्रकार स्ट्रिंग का है और उस संपत्ति में दिनांक सत्यापनकर्ता जोड़ सकता है , और यूआई पर इस संपत्ति के लिए बाध्य करें।

    [Display(Name = "Due date")]
    [Required]
    [AllowHtml]
    [DateValidation]
    public string DueDateString { get; set; }

    public DateTime? DueDate 
    {
        get
        {
            return string.IsNullOrEmpty(DueDateString) ? (DateTime?)null : DateTime.Parse(DueDateString);
        }
        set
        {
            DueDateString = value == null ? null : value.Value.ToString("d");
        }
    }

और यहाँ एक तारीख सत्यापनकर्ता है:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
public class DateValidationAttribute : ValidationAttribute
{
    public DateValidationAttribute()
    {
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            DateTime date;

            if (value is string)
            {
                if (!DateTime.TryParse((string)value, out date))
                {
                    return new ValidationResult(validationContext.DisplayName + " must be a valid date.");
                }
            }
            else
                date = (DateTime)value;

            if (date < new DateTime(1900, 1, 1) || date > new DateTime(3000, 12, 31))
            {
                return new ValidationResult(validationContext.DisplayName + " must be a valid date.");
            }
        }
        return null;
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.