ASP.NET MVC 3 में एक विशिष्ट प्रारूप में एक डेटटाइम कैसे प्रस्तुत करें?


117

यदि मेरे मॉडल वर्ग में मेरे पास संपत्ति का प्रकार है तो DateTimeमैं इसे एक विशिष्ट प्रारूप में कैसे प्रस्तुत कर सकता हूं - उदाहरण के लिए प्रारूप में जो ToLongDateString()रिटर्न देता है?

मैंने यह कोशिश की है ...

@Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString())

... जो एक अपवाद फेंकता है क्योंकि अभिव्यक्ति को एक संपत्ति या क्षेत्र को इंगित करना चाहिए। और इस...

@{var val = item.MyDateTime.ToLongDateString();
  Html.DisplayFor(modelItem => val);
}

... जो एक अपवाद नहीं फेंकता है, लेकिन प्रदान किया गया आउटपुट खाली है (हालांकि valइसमें अपेक्षित मूल्य शामिल है, जैसा कि मैं डिबगर में देख सकता था)।

अग्रिम में सुझावों के लिए धन्यवाद!

संपादित करें

ToLongDateStringकेवल एक उदाहरण है। इसके बजाय मैं वास्तव में जो उपयोग करना चाहता हूं ToLongDateStringवह है एक कस्टम एक्सटेंशन विधि DateTimeऔर DateTime?:

public static string FormatDateTimeHideMidNight(this DateTime dateTime)
{
    if (dateTime.TimeOfDay == TimeSpan.Zero)
        return dateTime.ToString("d");
    else
        return dateTime.ToString("g");
}

public static string FormatDateTimeHideMidNight(this DateTime? dateTime)
{
    if (dateTime.HasValue)
        return dateTime.Value.FormatDateTimeHideMidNight();
    else
        return "";
}

इसलिए, मुझे लगता है कि मैं ViewModel गुणों पर DisplayFormatविशेषता और DataFormatStringपैरामीटर का उपयोग नहीं कर सकता ।

जवाबों:


159

यदि आप सभी को एक विशिष्ट प्रारूप के साथ दिनांक प्रदर्शित करना चाहते हैं, तो कॉल करें:

@String.Format(myFormat, Model.MyDateTime)

@Html.DisplayFor(...)जब तक आप किसी टेम्पलेट को निर्दिष्ट नहीं कर रहे हैं, तब तक केवल अतिरिक्त कार्य का उपयोग करना है, या टेम्पलेट पर बनाया गया कुछ उपयोग करने की आवश्यकता है, जैसे कि एक को पुनरावृत्त करना IEnumerable<T>। एक टेम्पलेट बनाना काफी सरल है, और बहुत अधिक लचीलापन भी प्रदान कर सकता है। वर्तमान नियंत्रक (या साझा विचार फ़ोल्डर) के लिए अपने विचार फ़ोल्डर में एक फ़ोल्डर बनाएँ DisplayTemplates। उस फ़ोल्डर के अंदर, उस मॉडल प्रकार के साथ एक आंशिक दृश्य जोड़ें, जिसके लिए आप टेम्पलेट बनाना चाहते हैं। इस मामले में मैंने /Views/Shared/DisplayTemplatesएक आंशिक दृश्य जोड़ा और जोड़ा ShortDateTime.cshtml

@model System.DateTime

@Model.ToShortDateString()

और अब आप उस टेम्पलेट को निम्न पंक्ति के साथ कॉल कर सकते हैं:

@Html.DisplayFor(m => m.MyDateTime, "ShortDateTime")

धन्यवाद, यह अच्छा लग रहा है, और यह टेम्प्लेट पैरामीटर ("शॉर्टडेट टाइम") भी समस्या का हल करता है जो मैंने अपनी टिप्पणी में अतादेनी के उत्तर में वर्णित किया था।
सुलामा

3
यदि प्रकार "दिनांक समय है?" "DateTime" (@model DateTime?) के बजाय ... ciplay टेम्प्लेट अशक्त या अशक्त नहीं बनाएगा। फ़ाइल का नाम "DateTime.cshtml" रहना चाहिए।
रोमिया

+1 को इस पर टिप्पणी करनी थी, मेरे आवेदन में बहुत अच्छा काम किया! धन्यवाद!
रसेल क्रिस्टेन्सन

@ Html.DisplayFor () का उपयोग अतिरिक्त काम नहीं है, यह मॉडल के HTML प्रतिनिधित्व को प्रस्तुत करता है, यहां तक ​​कि टेम्पलेट्स के बिना भी .... भ्रमित न हों ...
Cabuxa.Mapache

stackoverflow.com/questions/19920603/… में कोड होता है जो अशक्त डेटासेट @Romias उल्लेख से निपटने में सहायक होता है।
वाल्टर डी जोंग

171

आप अपने दृश्य मॉडल गुण को [DisplayFormat]विशेषता से सजा सकते हैं :

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", 
               ApplyFormatInEditMode = true)]
public DateTime MyDateTime { get; set; }

और आपके विचार में:

@Html.EditorFor(x => x.MyDate)

या, मान प्रदर्शित करने के लिए,

@Html.DisplayFor(x => x.MyDate)

एक और संभावना, जिसकी मैं सिफारिश नहीं करता, एक कमजोर टाइप हेल्पर का उपयोग करना है:

@Html.TextBox("MyDate", Model.MyDate.ToLongDateString())

1
@ डारिन: मुझे इनपुट एलीमेंट नहीं चाहिए, लेकिन केवल स्टैटिक टेक्स्ट आउटपुट। मुझे यह भी उल्लेख करना चाहिए कि वास्तविक प्रारूप एक कस्टम एक्सटेंशन विधि द्वारा बनाया गया है DateTime(ToLongDateString केवल एक उदाहरण था), इसलिए यह संभावना नहीं है कि मैं उपयोग कर सकता हूं DataFormatString
सलुमा

2
@Slauma, कैसे के बारे में @Html.DisplayFor(x => x.MyDateTime)। @NickLarsen यही कारण है कि दृश्य मॉडल का उपयोग किया जाना चाहिए। मेरे उदाहरण में मैं इस विशेषता के साथ दृश्य मॉडल को सजाता हूं और एक दृश्य पहले से ही एक दिए गए दृश्य से बंधा हुआ है, यही इसका उद्देश्य है।
डारिन दिमित्रोव

1
@ सलुमा, ठीक है, इस मामले में आप या तो एक कस्टम डिस्प्ले टेम्प्लेट का उपयोग कर सकते हैं या आपके व्यू मॉडल में एक स्ट्रिंग प्रॉपर्टी का उपयोग किया जा सकता है और रूपांतरण मैपिंग लेयर पर किया जाएगा जब आप मॉडल और व्यू मॉडल के बीच मैप करेंगे (इस तरह से आप कर सकते हैं अभी भी केवल देखने में Html.DisplayFor का उपयोग करें)।
डारिन दिमित्रोव

5
@NickLarsen, नहीं, यह प्रति दृश्य एक दृश्य मॉडल है। ऐसा इसलिए है क्योंकि लोग यह गलती करते हैं कि मैं कैसे कुछ गुणों को एक नियंत्रक कार्रवाई में सत्यापन से अलग करता हूं और दूसरे पर नहीं? एसओ पर इतने आम हैं।
डारिन दिमित्रोव

1
एक साल बाद इस सवाल पर वापस आते हुए, मैं प्रति दृश्य एक मॉडल के तर्क से सहमत हूं। मुझे अभी भी लगता है कि प्रदर्शन विकल्पों के साथ काम करने वाला कुछ भी दृश्य में है और मॉडल नहीं है।
निक लार्सेन

26

मॉडल के अंदर सरल स्वरूपित आउटपुट

@String.Format("{0:d}", model.CreatedOn)

या फॉरेस्ट लूप में

@String.Format("{0:d}", item.CreatedOn)

का उपयोग कर के स्वीकार किए गए उत्तर की एक नकल की तरह लगता हैstring.Format
पॉल Tyng

2
@PaTTyng यह उत्तर मेरे लिए स्वीकृत उत्तर की तुलना में स्पष्ट था, ओडसुक ने वास्तव में पहले परम में प्रारूप दिखाया था, जो कि एक newb के रूप में, मेरी मदद करता है।
डैन ब्यूलियू

1
मैं सहमत हूं, यह उत्तर है जिसने मेरी मदद की।
ग्लेन गार्सन

26

मैं इनलाइन प्रारूप के लिए निम्नलिखित दृष्टिकोण का उपयोग करता हूं और मॉडल से दिनांक संपत्ति प्रदर्शित करता हूं।

@Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}")

अन्यथा जब एक TextBox या संपादक को पॉपिंग करना हो तो आप @Darin जैसा सुझाव दे सकते हैं, विशेषता के साथ विशेषता को सजाया है [DisplayFormat]


यही वह उपाय है जिसकी मुझे तलाश है!
Envil

यही वह उपाय है जिसकी मुझे तलाश थी!
रायन रिडॉय

9

यदि आपके सभी DateTimeप्रकार एक ही तरीके से प्रस्तुत किए जाते हैं तो आप एक कस्टम DateTimeडिस्प्ले टेम्प्लेट का उपयोग कर सकते हैं ।

आपके दृश्य फ़ोल्डर में "DisplayTemplates" नामक एक फ़ोल्डर आपके नियंत्रक विशिष्ट दृश्य फ़ोल्डर में, या "साझा" फ़ोल्डर के तहत (ये भाग के समान काम करते हैं) बनाते हैं।

अंदर नामक एक फ़ाइल बनाने DateTime.cshtmlकि लेता है DateTimeके रूप में @modelऔर कोड कैसे आप अपने तारीख को रखना चाहते हैं:

@model System.DateTime
@Model.ToLongDateString()

अब आप इसे केवल अपने विचारों में उपयोग कर सकते हैं और यह काम करना चाहिए:

@Html.DisplayFor(mod => mod.MyDateTime)

जब तक आप इसे "DisplayTemplates" फ़ोल्डर में जोड़ने के कन्वेंशन का पालन करते हैं और आपके द्वारा प्रदर्शित किए जा रहे प्रकार से मिलान करने के लिए फ़ाइल का नामकरण करते हैं, MVC स्वचालित रूप से आपके मूल्यों को प्रदर्शित करने के लिए उपयोग करेगा। यह "EditorTemplates" का उपयोग करके संपादन परिदृश्यों के लिए भी काम करता है।

यहां टेम्प्लेट के बारे में कुछ और जानकारी दी गई है


धन्यवाद, मैंने अभी इसका परीक्षण किया है और यह ठीक काम करता है यदि प्रकार वास्तव में है DateTime। हालाँकि मेरे पास कुछ अशक्त डेटाइम गुण हैं। मैंने DisplayTemplatesफोल्डर में एक दूसरी फाइल बनाने की कोशिश की , जिसे कहा जाता है NullableDateTime.cshtmlऔर भीतर: @using MyHelpers @model System.DateTime? @Model.MyCustomExtension()यहाँ MyCustomExtensionपर एक विस्तार विधि है DateTime?। हालाँकि यह एक अपवाद है जब एक DateTime? फ़ील्ड वास्तव में अशक्त है मुझे बताएं कि शब्दकोश में एक प्रकार के मॉडल तत्व की आवश्यकता होती है DateTimeजो शून्य नहीं है। वहाँ एक अशक्त DateTime के लिए DisplayTemplate को परिभाषित करने का एक तरीका है?
सल्लूमा

@ सलूमा: हम्म, अच्छा सवाल। मैं शायद NullableDateTime.cshtml@NickLarsen द्वारा सुझाए गए और उपयोग किए जाने वाले दृष्टिकोण का उपयोग करूंगा @Html.DisplayFor(m => m.MyDateTime, "NullableDateTime")
११:१०

यदि आपका DateTime.cshtml टेम्पलेट "@modelTime" के रूप में सेट है, तो आपको स्पष्ट रूप से टेम्पलेट का नाम जोड़ने की आवश्यकता नहीं है? "DateTime" के बजाय। इस तरह सभी तिथियों (अशक्त या नहीं) को एक ही टेम्पलेट द्वारा नियंत्रित किया जाता है ...
रोमिया

7

मेरी प्राथमिकता फॉर्मेटिंग विवरण को दृश्य के साथ रखने की है न कि दृश्यदर्शी की। तो MVC4 / रेजर में:

@Html.TextBoxFor(model => model.DateTime, "{0:d}");

डेटाटाइम प्रारूप संदर्भ: http://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.71).aspx

फिर मेरे पास एक JQuery का डेटापिक है, और उस तारीख को एक अलग प्रारूप के रूप में रखा गया है ... doh!

ऐसा लगता है कि मुझे दिनांक स्वरूप को उसी स्वरूपण में सेट करने की आवश्यकता है।

इसलिए मैं System.Globalizationडेटा को फॉर्मेटिंग में स्टोर कर रहा हूं- * विशेषता और इसे सेट करते समय एकत्रित करना

@Html.TextBoxFor(
    model => model.DateTime.Date, 
    "{0:d}", 
    new 
    { 
        @class = "datePicker", 
        @data_date_format=System.Globalization.CultureInfo
                          .CurrentUICulture.DateTimeFormat.ShortDatePattern 
    }));

और यहाँ एक बेकार हिस्सा है: .net और डेटपिकर के प्रारूप मेल नहीं खाते हैं, इसलिए हैकरी की आवश्यकता है:

$('.datePicker').each(function(){
    $(this).datepicker({
        dateFormat:$(this).data("dateFormat").toLowerCase().replace("yyyy","yy")
    });
});

यह कमजोर है, लेकिन बहुत सारे मामलों को कवर करना चाहिए।


पहली 3 पंक्तियाँ सबसे महत्वपूर्ण हैं :) उदाहरण और प्रारूप परिभाषा की लिंक
बोरिक

2

मेरे लिये कार्य करता है

<%=Model.MyDateTime.ToString("dd-MMM-yyyy")%>

यह प्रश्न स्पष्ट रूप से रेजर व्यू इंजन का उपयोग कर रहा है, आपने एक अलग भाषा का उपयोग करके उत्तर दिया है।
Rhys Bevilaqua

2

हाल ही में यही समस्या थी।

मुझे पता चला कि मॉडल में डेट के रूप में डेटा टाइप को परिभाषित करने के साथ ही साथ काम करता है (कोड प्रथम दृष्टिकोण का उपयोग करके)

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


0

अगर मैं सिर्फ लघु प्रारूप में तारीख प्रदर्शित करना चाहता हूं तो मैं सिर्फ @ Model.date.ToShortDateString () का उपयोग करता हूं और यह तिथि प्रिंट करता है


0

यदि आप सभी को एक विशिष्ट प्रारूप के साथ दिनांक प्रदर्शित करना चाहते हैं, तो कॉल करें:

@Model.LeadDate.ToString("dd-MMM-yyyy")

@Model.LeadDate.ToString("MM/dd/yy")

इसका परिणाम निम्न प्रारूप में होगा,

26-Apr-2013

04/26/13

@ Model.LeadDate == अशक्त होने पर क्या होगा?
बिमल दास

0

यह dd/MM/yyyyआपके दृश्य में प्रारूप में प्रदर्शित होगा

दृश्य में:

DisplayForइस कोड का उपयोग करने के बजाय

<td>

@(item.Startdate.HasValue ? item.Startdate.Value.ToString("dd/MM/yyyy") : "Date is Empty")

</td

यह यह भी जाँचता है कि क्या दिनांक स्तंभ में मान शून्य है, यदि सही है तो यह प्रदर्शित करेगा कि तिथि स्तंभ से खाली है या वास्तविक स्वरूपित तिथि है।

आशा किसी की मदद करती है।



0

MVC5 में, मैं उपयोग करूँगा, यदि आपका मॉडल डेटाइम है

string dt = Model.ToString("dd/MM/yyy"); 

या अगर आपके मॉडल में डेटाइम की संपत्ति है

string dt = Model.dateinModel.ToString("dd/MM/yyy"); 

यहाँ प्रारूप का आधिकारिक अर्थ है:

https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx


-2

केवल फ़ाइल फ़ाइल को इस तरह समायोजित करें। आप यह कोशिश कर सकते हैं।

@Html.FormatValue( (object)Convert.ChangeType(item.transdate, typeof(object)), 
                            "{0: yyyy-MM-dd}")

item.transdateयह आपके DateTimeप्रकार का डेटा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.