এমভিসি 4 ডেটা টাইপ.সামগ্রী সম্পাদকের জন্য ক্রোমে তারিখের মানটি প্রদর্শিত হবে না, ইন্টারনেট এক্সপ্লোরার-এ সূক্ষ্ম


198

আমি আমার মডেলটিতে ডেটা টাইপ.ডেট অ্যাট্রিবিউট এবং একটি এডিটরফোর্ড ব্যবহার করছি। এটি ইন্টারনেট এক্সপ্লোরার 8 এবং ইন্টারনেট এক্সপ্লোরার 9 এ সূক্ষ্মভাবে কাজ করছে , তবে গুগল ক্রোমে এটি একটি তারিখ চয়নকারী দেখায় এবং মানটি প্রদর্শন করার পরিবর্তে বিবর্ণ ধূসর লেখায় "মাস / দিন / বছর" প্রদর্শন করে।

গুগল ক্রোম কেন মানটি প্রদর্শন করবে না?

মডেল:

[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)]এএসপি.নেট এমভিসি 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" />

এইচটিএমএল 5 যেমন গুগল ক্রোম সমর্থন করে এমন ব্রাউজারগুলি এই ইনপুট ফিল্ডটিকে একটি তারিখ চয়নকারীর সাথে রেন্ডার করে।

তারিখটি সঠিকভাবে প্রদর্শন করতে, মানটি অবশ্যই ফর্ম্যাট করতে হবে 2012-09-28স্পেসিফিকেশন থেকে উদ্ধৃতি :

মান: [আরএফসি 3339] এ সংজ্ঞায়িত হিসাবে একটি বৈধ পূর্ণ-তারিখ, বর্ষের উপাদানটি 0 বা তার চেয়ে বেশি সংখ্যক প্রতিনিধিত্ব করে এমন চার বা ততোধিক সংখ্যার অতিরিক্ত যোগ্যতার সাথে।

আপনি এই DisplayFormatবৈশিষ্ট্যটি ব্যবহার করে এই ফর্ম্যাটটি প্রয়োগ করতে পারেন :

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

44
ডারিন আপনাকে ধন্যবাদ, যে নিখুঁত ছিল! আপনি গত দুই বছরে আমার অনেক এমভিসি প্রশ্নের উত্তর দিয়েছেন, আপনি রক!
বেন ফিনকেল

3
দুর্দান্ত উত্তর কিন্তু আমি অনুভব করছি এটি আবেদন করছে যে আপনি ঠিকভাবে কাজ করার নিয়ন্ত্রণ পেতে এটি বাধ্য করতে হবে!
কুপস

7
চিহ্নিত সমস্ত সম্পত্তিগুলির জন্য "বিশ্বব্যাপী" এটি করার উপায় কী হবে [DataType(DataType.Date)]তাই কিছু হারিয়ে যাওয়ার ঝুঁকি নিয়ে এই সমস্ত সম্পত্তি আলাদা করে চিহ্নিত করতে হবে না?
মার্জন ভেনেমা

7
ডারিন, মার্কিন যুক্তরাষ্ট্রের বাইরের লোকেরা আমরা কী করতে পারি? আমি কীভাবে স্পেসিফিকেশন মান সেট করতে পারি তবে একটি কাস্টম তারিখের ফর্ম্যাটটি প্রদর্শন করতে পারি? অর্থাত্ ইউকে?
পাইটর কুলা

3
@ মারজানভেনেমা- আমি ম্যাট হানিটকের ফেইল ট্র্যাকার ( github.com/MattHoneycutt/Fail-Tracker ) থেকে "এক্সটেনসিবল মডেলমেটাডাটাপ্রভাইডার" ব্যবহার করেছি । মডেলমেটাডাটা অবকাঠামো ফোল্ডারের নিচে দেখুন। আমি এই ক্লাসগুলি ব্যবহার করেছি এবং তারপরে IModelMetadataFilter এর ফিল্টার বাস্তবায়ন তৈরি করেছি। যখন ট্রান্সফর্মমেটাডাটা পদ্ধতিটি ডাকা হয়, আপনি তারপরে মেটাডেটার "ডিসপ্লেফোর্ম্যাটস্ট্রিং" এবং "সম্পাদনা ফর্ম্যাটস্ট্রিং" বৈশিষ্ট্যগুলি সম্পাদনা করতে পারেন। আশা করি এটি আপনাকে সঠিক পথে নিয়েছে (বিটিডব্লিউ, একটি দুর্দান্ত বহুত্বদৃষ্টি ভিডিও রয়েছে যা ব্যর্থ-ট্র্যাকার ব্যবহার করে)
সোয়াম্পিফক্স

44

এমভিসি 5.2-তে, ফোল্ডারে Date / ভিউ / শেয়ার / এডিটর-টিম্পলেটগুলিতে ডেট.কোশটিএমএল যুক্ত করুন:

@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)
}

ধন্যবাদ! উল্লিখিত ক্রোম "ইস্যু" সংশোধন করে এবং অবশ্যই আপনার ডেটটাইম সম্পত্তিতে অন্য একটি ডিসপ্লেফর্ম্যাট থাকতে পারে!
সেএমএক্সএল

হ্যাঁ দুর্দান্ত সমাধান। এটি মার্কিন যুক্তরাষ্ট্রে নয় যারা তাদের জন্য একটি দুর্দান্ত কাজ প্রদান করে।
রিচার্ড ম্যাককেনা

আমি মনে করি এটি সমস্যার সর্বোত্তম সমাধান, এটি কেবল সম্পাদক সমস্যা সমাধান করে এবং বিদ্যমান প্রদর্শন বিন্যাসকে প্রভাবিত করে না।
dsghi

1
"ডেটটাইম.সি.এস.টি.এম.এল." এর পরিবর্তে "ডেট.কোশটিএমএল" ব্যবহার করা ম্যাজিক উত্তর ছিল! এটি এমভিসি 4 তেও কাজ করে।
অ্যাট্রোন সেগেই


16

দারিন দিমিত্রভের উত্তরের সংযোজন হিসাবে:

আপনি যদি কেবলমাত্র এই নির্দিষ্ট লাইনটি নির্দিষ্ট (মান থেকে পৃথক) ফর্ম্যাট ব্যবহার করতে চান তবে আপনি এমভিসি 5 এ ব্যবহার করতে পারেন:

@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

এমভিসি 3 এ আমাকে যুক্ত করতে হয়েছিল:

using System.ComponentModel.DataAnnotations;

বৈশিষ্ট্য যুক্ত করার সময় ব্যবহারের মধ্যে:

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

বিশেষত যদি আপনি আমার মতো .edmx ফাইলে এই বৈশিষ্ট্যগুলি যুক্ত করে থাকেন। আমি আবিষ্কার করেছি যে ডিফল্ট .edmx ফাইলগুলিতে এটি ব্যবহার করে না তাই কেবল প্রপেসি যুক্ত করা যথেষ্ট নয়।


10

আপনি যদি [DataType(DataType.Date)]আপনার মডেল থেকে সরিয়ে থাকেন তবে ক্রোমের ইনপুট ক্ষেত্রটি রেন্ডার হয়ে গেছে type="datetime"এবং ডেটপিকারটিও দেখায় না।


ধন্যবাদ বার্নি ডেটা ইনপুট বাক্সে না রাখার কারণে আমি পিকারটি দেখানোর সাথে এতটা সমস্যায় পড়িনি। যদিও এটি জানা ভাল।
বেন ফিনকেল 4'12

অপেরা যদিও ডেটপিকারকে রেন্ডার করে। কিছু পলিফিল করতে আধুনিকীকরণ ব্যবহার করুন
ক্লেফেরিস

1
যদি এটি কোনও তারিখ হওয়ার কথা, তবে এটি টাইপের ইনপুট হিসাবে রেন্ডার করা উচিত date। কাজের ক্ষেত্র datetimeহিসাবে ব্যবহার করা অনুচিত, কারণ এটি শব্দার্থভাবে ডেটা উপস্থাপন করে না।
ক্রিস প্র্যাট

4

YYYY-MM-dd ফর্ম্যাটটি পাস করার সাথে আমার এখনও একটি সমস্যা ছিল, তবে আমি ডেট.এসএইচটিএমএল পরিবর্তন করে এটি পেয়েছিলাম:

@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, এবং এটি ভাল কাজ করে, আমি প্রথম ডাটাবেস ডাটাবেস ব্যবহার করেছি তবে ডিসপ্লেফর্ম্যাট আংশিক শ্রেণীর সাথে কাজ করে না, কেন জানি না, যাইহোক যে কেউ যদি এই পদ্ধতিতে চেষ্টা করে তবে আমি করিনি ' চেষ্টা করুন তবে কারও যদি প্রয়োজন হয়, আশা করি এটি সহায়তা করে
শেইজুত

3

প্রতিউত্তর এমভিসি 4 ডেটা টাইপকে ate তারিখ সম্পাদকের ক্রোমে তারিখের মান প্রদর্শিত হবে না, আইই-তে সূক্ষ্ম

মডেলটিতে আপনার নিম্নলিখিত ধরণের ঘোষণার দরকার:

[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)]

ডেট.সিএইচটিএমএলে এই টেম্পলেটটি ব্যবহার করুন:

@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 করুন) অন্যটি করুন @Html.TextBox("EstPurchaseDate", dt.ToString("MM/dd/yyyy"))দ্রষ্টব্য: # 2 তে আরও ভাল পরীক্ষা করা হবে ব্রাউজারটি HTML5 বোঝে, তবে কীভাবে তা করতে হয় তা আমি জানি না।
ডেভিড

4
সার্ভার সাইড কোডে ব্রাউজার সনাক্তকরণের জন্য ডাউনভোটিং।
তেটসুজন নো ওনি

1

আপনার যদি তারিখের ফর্ম্যাটটির নিয়ন্ত্রণ রাখতে হয় (অন্য কথায় কেবল ইয়াই-মিমি-ডিডি ফর্ম্যাটটি গ্রহণযোগ্য নয়), অন্য একটি সমাধান হ'ল প্রকারের সাহায্যকারী সম্পত্তি যুক্ত করে সেই সম্পত্তিটিতে একটি তারিখ যাচাইকারী যুক্ত করতে পারে , এবং এই সম্পত্তিটি ইউআই-তে বাঁধুন।

    [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;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.